Sistema de Monitoramento de Temperatura e Umidade para Armazéns

Comandos de Controel

Ativar aquecedor fa 10 01 01 b0 55 fb FA 10 01 02 00 00 20 FB Desativar aquecedor fa 10 01 03 31 94 fb FA 10 01 04 00 00 0A FB

Ativar desumidificador fa 10 01 05 b1 96 fb FA 10 01 06 00 00 1C FB Desativar desumidificador fa 10 01 07 30 57 fb FA 10 01 08 00 00 25 FB

Ativar ventilação fa 10 01 09 b1 93 fb FA 10 01 0A 00 00 06 FB Desativar ventilação fa 10 01 0b 30 52 fb FA 10 01 0C 00 00 0F FB

Ativar alarme fa 10 00 0d b1 c0 fb Desativar alarme fa 10 00 0f 30 01 fb

Alterar endereço do dispsoitivo fa 10 00 59 10 11 f8 1c fb Resposta de alteração FA 10 11 69 01 BB 71 FB

fa 10 11 59 10 00 3d 2c fb

Monitoramento: 1005 Controel: 1001 10 00 59 10 01 f9 d0 Leitura sensores fa 10 01 54 70 6a fb fa 10 02 54 70 9a fb fa 10 03 54 71 0a fb Comando controle fa 20 03 01 b1 3a fb

Implementação do Sistema:

public class GraficoTemperatura
{
    public GraficoTemperatura()
    { }
    private Graphics superficieDesenho;
    private Bitmap imagemGrafico;
    
    private int largura = 640;
    private int altura = 480;
    private float escalaX = 50;
    private float escalaY = 50;
    private float intervaloY = 20;
    private float baseY = 0;
    private float suavizacao = 0.5f;
    private string titulo = "Monitoramento de Ambiente";
    private string unidade = "Valores";
    private string rotuloX = "Período";
    private string rotuloY = "Medições";
    private string[] categorias = new string[] { "Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez" };
    private int[] dados = new int[] { 32, 12, 32, 43, 54, 35, 35, 42, 63, 35, 35, 67 };

    public Bitmap GerarImagem()
    {
        PrepararGrafico();
        RenderizarConteudo(ref superficieDesenho);
        return imagemGrafico;
    }

    private void PrepararGrafico()
    {
        imagemGrafico = new Bitmap(largura, altura);
        superficieDesenho = Graphics.FromImage(imagemGrafico);
        
        superficieDesenho.DrawRectangle(new Pen(Color.Black, 1), 0, 0, largura, altura);
        superficieDesenho.FillRectangle(new SolidBrush(Color.White), 1, 1, largura - 2, altura - 2);
        
        superficieDesenho.DrawLine(new Pen(Color.Black, 1), 100, altura - 100, largura - 75, altura - 100);
        superficieDesenho.DrawLine(new Pen(Color.Black, 1), 100, altura - 100, 100, 75);
        
        ConfigurarEixos(ref superficieDesenho);
        DefinirEscalaX(ref superficieDesenho);
        DefinirEscalaY(ref superficieDesenho);
        AdicionarTitulo(ref superficieDesenho);
    }

    private void RenderizarConteudo(ref Graphics canvas)
    {
        if (categorias.Length == dados.Length)
        {
            PointF[] pontos = new PointF[categorias.Length];
            float posYBase = (altura - 100) + baseY;
            float fatorY = (escalaY / 50) * (50 / intervaloY);

            for (int i = 0; i < categorias.Length; i++)
            {
                float posX = escalaX * i + 100;
                float posY = posYBase - dados[i] * fatorY;
                pontos[i] = new PointF(posX, posY);
            }
            canvas.DrawCurve(new Pen(Color.Red, 1), pontos, suavizacao);
        }
        else
        {
            canvas.DrawString("Erro: Quantidade de categorias e dados divergem", 
                new Font("Arial", 10), new SolidBrush(Color.Red), new Point(150, altura / 2));
        }
    }
}

Gráfico``` public class Principal : Form { private SerialPort portaSerial; private System.Timers.Timer temporizador;

public Principal()
{
    InicializarComponentes();
}

private void Principal_Carregamento(object sender, EventArgs e)
{
    VerificarRegistro();
    IniciarMonitoramento();
    
    temporizador = new System.Timers.Timer();
    temporizador.Interval = 20000;
    temporizador.Elapsed += Temporizador_Evento;
    temporizador.Start();
}

private void IniciarMonitoramento()
{
    portaSerial = new SerialPort();
    portaSerial.Open();
    portaSerial.DataReceived += DadosRecebidos;
}

private void DadosRecebidos(object sender, SerialDataReceivedEventArgs e)
{
    byte[] buffer = new byte[portaSerial.BytesToRead];
    portaSerial.Read(buffer, 0, buffer.Length);
    ProcessarLeituras(buffer);
}

private void ProcessarLeituras(byte[] dados)
{
    string hexDados = BitConverter.ToString(dados).Replace("-", "");
    
    if (hexDados.Length == 38)
    {
        string[] partes = hexDados.Split(' ');
        string codigoSensor = partes[1] + partes[2];
        
        double temperatura = ConverterHexDecimal(partes[5]);
        double umidade = ConverterHexDecimal(partes[6]);
        
        AtualizarInterface(codigoSensor, temperatura, umidade);
        VerificarAlertas(temperatura, umidade);
    }
}

private void VerificarAlertas(double temp, double umid)
{
    if (temp > 40 || umid > 80)
    {
        MostrarAlerta($"Alerta: Temperatura {temp}°C, Umidade {umid}%");
    }
}

}


Monitoramento```
public class Configuracao : Form
{
    public Configuracao()
    {
        InicializarComponentes();
    }

    private void AlternarInicializacaoSistema(object sender, EventArgs e)
    {
        string caminhoApp = Application.ExecutablePath;
        RegistryKey registro = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
        
        if (registro.GetValue("MonitorArmazem") == null)
        {
            registro.SetValue("MonitorArmazem", caminhoApp);
        }
        else
        {
            registro.DeleteValue("MonitorArmazem");
        }
    }
}

Configuração

Tags: C# SerialPort WinForms MonitoramentoAmbiental .NET

Publicado em 7-6 10:28