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.

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.

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

, -. 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() {
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, . :

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é:

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.