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.

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.

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

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

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:

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.