Construindo uma casa inteligente com o ASP.NET Core e o Arduino

Durante a quarentena, havia muito tempo que eu queria gastar com lucro e consolidar meu conhecimento adquirido em diferentes campos; este acabou sendo um projeto pequeno que qualquer desenvolvedor pode repetir facilmente.


imagem


Sou estudante, moro em um dormitório. Sempre há problemas com o micro-clima na sala: é quente, depois frio, e não há ar suficiente, mas eu queria viver em condições normais para um trabalho e estudo confortáveis.


Então vamos começar.


Mínimo requerido


No canto havia um fã velho, mas poderoso.


imagem


Há também um Arduino Uno que sobrou da escola.


imagem


, -. VPS Centos 7.



Arduino. .


  #include <Adafruit_GFX.h>
  #include <Adafruit_PCD8544.h>
  #include "DHT.h"
  #define DHTPIN 2 //  ,    
  int fanPin = 3;
  byte incomingByte;
  DHT dht(DHTPIN, DHT22);

  void setup() {
    pinMode(fanPin, OUTPUT);
    Serial.begin(9600);
    dht.begin();
  }

  void loop() {
    //  2   
    delay(2000);
    // 
    float h = dht.readHumidity();
    //  
    float t = dht.readTemperature();
    //     .
    if (isnan(h) || isnan(t)) {
      Serial.println("   ");
      return;
    } 

    Serial.print(" ");
    Serial.print( h );
    Serial.print(" ");
    Serial.print(t);
    Serial.print(" \n");

    if (Serial.available() > 0) {
      incomingByte = Serial.read();

      if(incomingByte == '0'){
        digitalWrite(fanPin, HIGH);
      }
      else if (incomingByte == '1'){
        digitalWrite(fanPin, LOW); 
      }
        Serial.print("I received: ");
        Serial.println(incomingByte, DEC);
    }
  }

ASP.Net ore Arduino . , / - Arduino.


        public void Program()
        {
weatherContext db = new weatherContext();
            var serialPort = new SerialPort("COM3")
            {
                BaudRate = 9600,
                Parity = Parity.None,
                StopBits = StopBits.One,
                DataBits = 8,
                Handshake = Handshake.None
            };
            serialPort.Open();
            var reg = new Regex(@"[0-9]{2}\.[0-9]{2}\s[0-9]{2}\.[0-9]{2}");

            List<DeviceDTO> deviceDTOs = new List<DeviceDTO>();
            var userDevices = db.UserDevices.Where(d => d.UserId == 0);
            foreach (var userDevice in userDevices)
            {
                var device = db.Devices.Where(d => d.Id == userDevice.DeviceId).FirstOrDefault();
                if (device != null)
                {
                    DeviceDTO deviceDTO = new DeviceDTO()
                    {
                        Id = device.Id,
                        Status = device.Status,
                        Name = device.Name
                    };
                    deviceDTOs.Add(deviceDTO);
                }
            }
            while (true)
            {
                DeviceActivator(serialPort, deviceDTOs);
                string message = serialPort.ReadExisting();
                Console.WriteLine("message is: " + message);
                var match = reg.Match(message);
                IFormatProvider formatter = new NumberFormatInfo { NumberDecimalSeparator = "." };
                if (match.Success)
                {
                    string a = message.Substring(0, 5);
                    double humidity = double.Parse(a, formatter);
                    double temperature = double.Parse(message.Substring(6, 5), formatter);

                    List<MeteringWriteDTO> meterings = new List<MeteringWriteDTO>();
                    var meteringTemperature = new MeteringWriteDTO()
                    {
                        Id = meteringCount + 1,
                        Date = DateTime.UtcNow,
                        Value = temperature,
                        SensorId = 0,
                    };
                    meterings.Add(meteringTemperature);
                    var meteringHumidity = new MeteringWriteDTO()
                    {
                        Id = meteringCount + 1,
                        Date = DateTime.UtcNow,
                        Value = humidity,
                        SensorId = 1,
                    };
                    meterings.Add(meteringHumidity);
                    SetSecondMetering(meterings);
                    Console.WriteLine(message + DateTime.UtcNow + '\n');
                    System.Threading.Thread.Sleep(1000);
                }
                if (DateTime.UtcNow.Second == 0)
                {
                    SetMinuteMetering();
                }
                if (DateTime.UtcNow.Minute == 0 && DateTime.UtcNow.Second == 0)
                {
                    SetHourMetering();
                }
                if (DateTime.UtcNow.Hour == 0 && DateTime.UtcNow.Minute == 0 && DateTime.UtcNow.Second == 0)
                {
                    AddDay();
                }
            }
        }

PostgreSQL.


, :


imagem


, :


imagem


- ASP.NET Core, . :


imagem


Como você pode ver, tudo é breve e amplo. Você pode alterar o status do dispositivo e ver as leituras dos sensores por um determinado período de tempo.


Sumário


Testando o que aconteceu:


imagem


Tudo está funcionando! O ventilador inicia e para quase sem demora.


Está planejado adicionar gráficos com leituras de sensores, um sistema de autorização para que outros usuários possam implantar esse sistema em casa. Você pode ajustar facilmente os valores nos quais os dispositivos serão ligados automaticamente. Além disso, o número de sensores e dispositivos deve aumentar.


Se você estiver interessado no projeto, eu posso criar artigos separados para cada etapa do desenvolvimento.


All Articles