جعل المنزل الذكي مع ASP.NET Core و Arduino

أثناء الحجر الصحي ، كان هناك الكثير من الوقت الذي أردت أن أقضيه بشكل مربح ودمج معرفتي المكتسبة من مجالات مختلفة ، وتبين أن هذا مشروع صغير يمكن لأي مطور تكراره بسهولة.


صورة


أنا طالب ، أعيش في مهجع. هناك دائمًا مشاكل في المناخ الصغير في الغرفة: الجو حار ، ثم بارد ، ثم لا يوجد ما يكفي من الهواء ، لكنني أردت العيش في ظروف طبيعية للعمل والدراسة المريحين.


لذلك دعونا نبدأ.


الحد الأدنى المطلوب


في الزاوية كانت مروحة قديمة ولكنها قوية.


صورة


يوجد أيضًا Arduino Uno متبقيًا من المدرسة.


صورة


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


, :


صورة


, :


صورة


- ASP.NET Core, . :


صورة


كما ترون ، كل شيء موجز وقوي. يمكنك تغيير حالة الجهاز والاطلاع على قراءات المستشعرات لفترة زمنية معينة.


ملخص


اختبار ما حدث:


صورة


كل شيء يعمل! تبدأ المروحة وتتوقف تقريبًا دون تأخير.


من المخطط إضافة الرسوم البيانية مع قراءات المستشعر ، وهو نظام ترخيص بحيث يمكن للمستخدمين الآخرين نشر هذا النظام في المنزل. يمكنك بسهولة ضبط القيم التي سيتم تشغيل الأجهزة بها تلقائيًا. أيضا ، من المفترض أن يزداد عدد أجهزة الاستشعار والأجهزة.


إذا كنت مهتمًا بالمشروع ، فيمكنني عمل مقالات منفصلة لكل خطوة تطوير.


All Articles