Faire une maison intelligente avec ASP.NET Core et Arduino

Pendant la quarantaine, il y avait beaucoup de temps que je voulais passer de manière rentable et consolider mes connaissances acquises dans différents domaines, cela s'est avéré être un petit projet que tout développeur peut facilement répéter.


image


Je suis étudiante, j'habite dans un dortoir. Il y a toujours des problèmes avec le microclimat dans la pièce: il fait chaud, puis froid, alors il n'y a pas assez d'air, mais je voulais vivre dans des conditions normales pour travailler et étudier confortablement.


Alors, commençons.


Minimum requis


Dans le coin, il y avait un vieux mais puissant fan.


image


Il reste également un Arduino Uno de l'école.


image


, -. 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.


, :


image


, :


image


- ASP.NET Core, . :


image


Comme vous pouvez le voir, tout est bref et vaste. Vous pouvez modifier l'état de l'appareil et voir les lectures des capteurs pendant une certaine période de temps.


Sommaire


Tester ce qui s'est passé:


image


Tout fonctionne! Le ventilateur démarre et s'arrête presque sans délai.


Il est prévu d'ajouter des graphiques avec des lectures de capteurs, un système d'autorisation afin que d'autres utilisateurs puissent déployer ce système à domicile. Vous pouvez facilement ajuster les valeurs auxquelles les appareils s'allumeront automatiquement. De plus, le nombre de capteurs et d'appareils devrait augmenter.


Si le projet vous intéresse, je peux créer des articles séparés pour chaque étape de développement.


All Articles