Membuat rumah pintar dengan ASP.NET Core dan Arduino

Selama karantina, ada banyak waktu yang saya ingin habiskan dengan menguntungkan dan mengkonsolidasikan pengetahuan saya yang diperoleh dari bidang yang berbeda, ini ternyata merupakan proyek kecil yang mudah diulangi oleh pengembang mana pun.


gambar


Saya seorang siswa, saya tinggal di asrama. Selalu ada masalah dengan iklim mikro di ruangan: panas, lalu dingin, maka tidak ada udara yang cukup, tetapi saya ingin hidup dalam kondisi normal untuk bekerja dan belajar yang nyaman.


Jadi mari kita mulai.


Persyaratan minimum


Di sudut ada kipas yang tua tapi kuat.


gambar


Ada juga Uno Arduino yang tersisa dari sekolah.


gambar


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


, :


gambar


, :


gambar


- ASP.NET Core, . :


gambar


Seperti yang Anda lihat, semuanya singkat dan luas. Anda dapat mengubah status perangkat dan melihat pembacaan sensor untuk jangka waktu tertentu.


Ringkasan


Menguji apa yang terjadi:


gambar


Semuanya berfungsi! Kipas mulai dan berhenti hampir tanpa penundaan.


Direncanakan untuk menambahkan grafik dengan pembacaan sensor, sistem otorisasi sehingga pengguna lain dapat menggunakan sistem ini di rumah. Anda dapat dengan mudah menyesuaikan nilai perangkat yang akan dihidupkan secara otomatis. Juga, jumlah sensor dan perangkat seharusnya meningkat.


Jika Anda tertarik dengan proyek ini, maka saya dapat membuat artikel terpisah untuk setiap langkah pengembangan.


All Articles