Имеем в наличии системник:

Внешние размеры:
Высота: 425мм
Ширина: 220мм
Длинна: 580мм.
Свет
В качестве источника света используется 3 светильника NEO-L-48LS2835_448-L1SP-PNK1002800000 -con (.pdf). Покупка на официальном сайте невозможна физическому лицу. Покупал через офис в Ленинграде писал на эл. почту neon@e-neon.ru. Также есть посредник в Воронеже — ИП Переславцев А. В., тел. +7 903 650-37-43, эл. почта pereslavcev_av@mail.ru.
Контроллер управления и мониторинга
Собран на основе wi-fi-модуля ESP8266.

Ссылка на али.
Основные задачи контроллера климата
- Собирает температуру: внутри, снаружи и температуру алюминиевого радиатора;
- На основе температуры управляет оборотами вентилятора угольного фильтра (он же вытяжной вентилятор);
- Фиксирует фактическое наличие света внутри.
- Мониторит датчик открытия боковой крышки системника (для оповещения в телегам);
- Собирает информацию о фактических оборотах вентиляторов (угольного фильтра и обдувочного вентилятора) для определния проблем с вращением;
- Управляет светильником включая или выключая часть света для предотварщения перегрева.
- Определяет в каком режиме «день/ночь» находится таймер.
- Передача собранных данных на zabbix-сервер для мониторинга и оповещений через wi-fi;
Блок-схема

Проверка подключения к zabbix-серверу.
К модулю ничего не надо подключать. Достаточно залить скетч и проверить что данные отправляются на zabbix.
Не забываем заменить:
const char* ssid = "ИМЯ_ВАШЕЙ_WI-FI_СЕТИ";
const char* password = "ПАРОЛЬ";
#define SERVERADDR XX, XX, XX, XX
IPAddress ip(192,168,0,XX); //статический IP
На свои данные.
/*
ESP8266
Climate controller for L72PC
1. zabbix
*/
#include <ESP8266ZabbixSender.h>
ESP8266ZabbixSender zSender;
/* WiFi settings */
const char* ssid = "ИМЯ_ВАШЕЙ_WI-FI_СЕТИ";
const char* password = "ПАРОЛЬ";
/* Zabbix server setting */
#define SERVERADDR XX, XX, XX, XX // IP-адрес Zabbix server Address
#define ZABBIXPORT 10051 // Zabbix erver Port
#define ZABBIXAGHOST "ESP8266" // Zabbix item's host name
boolean checkConnection();
IPAddress ip(192,168,0,XX); //статический IP
IPAddress gateway(192,168,0,1);
IPAddress subnet(255,255,255,0);
IPAddress primaryDNS(192, 168, 0, 1); //optional
IPAddress secondaryDNS(8, 8, 8, 8); //optional
void setup() {
Serial.begin(9600);
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
Serial.println();
Serial.print("Connecting to "); // "Подключаемся к "
Serial.println(ssid);
WiFi.config(ip, gateway, subnet, primaryDNS, secondaryDNS);
WiFi.begin(ssid, password);
while (!checkConnection()) {
}
zSender.Init(IPAddress(SERVERADDR), ZABBIXPORT, ZABBIXAGHOST); // Init zabbix server information
Serial.println("");
Serial.println("WiFi connected"); // "Подключение к WiFi выполнено"
Serial.println(WiFi.localIP());
}
// the loop function runs over and over again forever
void loop() {
checkConnection();
zSender.ClearItem();
float tempC=77;
zSender.AddItem("test", (float)tempC);
if (zSender.Send() == EXIT_SUCCESS) { // Send zabbix items
Serial.println("ZABBIX SEND: OK");
} else {
Serial.println("ZABBIX SEND: NG");
}
zSender.ClearItem();
Serial.println();
delay(5000); // wait 5sec
}
boolean checkConnection() {
int count = 0;
Serial.print("Waiting for Wi-Fi connection");
while (count < 300) {
if (WiFi.status() == WL_CONNECTED) {
Serial.println();
Serial.println("Connected!");
return (true);
}
delay(500);
Serial.print(".");
count++;
}
Serial.println("Timed out.");
return false;
}
Модуль должен начать пинговаться, в Serial моните должны быть успешные отправки.
Вычисление фактических портов
Часто рисунок на плате не соответствует фактической распиновке и надо определить где какой D числится по факту.
Для этого надо залить скетч:

Воткнуть один конец провода в GND модуля вторым концом прозвонить порты D. Потом аналогично воткнуть один конец провода в «+» вторым протыкать порты. И проделать тоже самое с резистором на 4,7к или 10к.
Пробовать менять pushButton с 2 на от 0 до 20. У меня получилась следующая таблица:
| Pin (программный) | На плате |
| 0 | D3 (220В) |
| 2 | D4 |
| 4 | D2 (ONE_WIRE_BUS) |
| 5 | D1 (DoorSensor) |
| 12 | D6 (Relay) |
| 13 | D7 |
| 14 | D5 |
| 15 | D8 (rpm carbon) |
| 16 | D0 (pwm) |
Подключение датчиков температуры
Согласно проекту будет использоваться 3 датчика DS18B20.
Подключение осуществляется в нормальном режиме (не паразитном):

DATA датчиков температуры подключается к D2 (G2) модуля (програмный pin 4).

Скетч с датчиками температуры и мониторингом.
Не забываем заменить:
const char* ssid = «ИМЯ_ВАШЕЙ_WI-FI_СЕТИ»;
const char* password = «ПАРОЛЬ»;
#define SERVERADDR XX, XX, XX, XX
IPAddress ip(192,168,0,XX); //статический IP
На свои данные.
/*
ESP8266
Climate controller for L72PC
1. zabbix
2. Sensors DS18B20 on D2 print on board (D4-program)
*/
//Zabbix
#include <ESP8266ZabbixSender.h>
//Dallas
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 4
#define TEMPERATURE_PRECISION 12
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int numberOfDevices;
DeviceAddress tempDeviceAddress;
//Zabbix
ESP8266ZabbixSender zSender;
/* WiFi settings */
const char* ssid = "ИМЯ_ВАШЕЙ_WI-FI_СЕТИ";
const char* password = "ПАРОЛЬ";
/* Zabbix server setting */
#define SERVERADDR XX, XX, XX, XX // Zabbix server Address
#define ZABBIXPORT 10051 // Zabbix erver Port
#define ZABBIXAGHOST "l72pc" // Zabbix item's host name
boolean checkConnection();
IPAddress ip(192,168,0,XX); //статический IP
IPAddress gateway(192,168,0,1);
IPAddress subnet(255,255,255,0);
IPAddress primaryDNS(192, 168, 0, 1); //optional
IPAddress secondaryDNS(8, 8, 8, 8); //optional
void setup() {
Serial.begin(9600);
sensors.begin();
numberOfDevices = sensors.getDeviceCount();
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
Serial.println();
Serial.print("Connecting to "); // "Подключаемся к "
Serial.println(ssid);
WiFi.config(ip, gateway, subnet, primaryDNS, secondaryDNS);
WiFi.begin(ssid, password);
zSender.Init(IPAddress(SERVERADDR), ZABBIXPORT, ZABBIXAGHOST); // Init zabbix server information
Serial.println("");
Serial.println("WiFi connected"); // "Подключение к WiFi выполнено"
Serial.println(WiFi.localIP());
}
// the loop function runs over and over again forever
void loop() {
sensors.requestTemperatures();
float tempinside;
sensors.getAddress(tempDeviceAddress, 0);
sensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION);
tempinside = sensors.getTempC(tempDeviceAddress);
float tempoutside;
sensors.getAddress(tempDeviceAddress, 1);
sensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION);
tempoutside = sensors.getTempC(tempDeviceAddress);
float tempproff;
sensors.getAddress(tempDeviceAddress, 2);
sensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION);
tempproff = sensors.getTempC(tempDeviceAddress);
Serial.print("Temp Inside: ");
Serial.print(tempinside);
Serial.print("°C; ");
Serial.print("Temp Outside: ");
Serial.print(tempoutside);
Serial.print("°C; ");
Serial.print("Temp proff: ");
Serial.print(tempproff);
Serial.print("°C;");
Serial.println();
checkConnection();
zSender.ClearItem();
zSender.AddItem("tempinside", (float)tempinside);
zSender.AddItem("tempoutside", (float)tempoutside);
zSender.AddItem("tempproff", (float)tempproff);
if (zSender.Send() == EXIT_SUCCESS) { // Send zabbix items
Serial.println("ZABBIX SEND: OK");
} else {
Serial.println("ZABBIX SEND: NG");
}
zSender.ClearItem();
Serial.println();
delay(5000);
}
boolean checkConnection() {
int count = 0;
Serial.print("Waiting for Wi-Fi connection");
while (count < 3) {
if (WiFi.status() == WL_CONNECTED) {
Serial.println();
Serial.println("Connected!");
return (true);
}
delay(500);
Serial.print(".");
count++;
}
Serial.println("Timed out.");
return false;
}
Скет должен писать в темринал serial примерно следующую информацию:
Temp Inside: 24.44°C; Temp Outside: 25.13°C; Temp proff: 23.69°C;
Waiting for Wi-Fi connection
Connected!
request = ZBXD {«request»:»sender data»,»data»:[{«host»:»l72pc»,»key»:»tempinside»,»value»:»24.44″},{«host»:»l72pc»,»key»:»tempoutside»,»value»:»25.13″},{«host»:»l72pc»,»key»:»tempproff»,»value»:»23.69″}]}
result = ZBXDZ{«response»:»success»,»info»:»processed: 3; failed: 0; total: 3; seconds spent: 0.000148″}
ZABBIX SEND: OK
Так же в zabbix должны отображаться графики:

Скетч позволяет работать автономно контроллеру климата независимо от того подключился он или нет к wi-fi либо потерял его в процессе работы.
Подключение PWN для вентилятора угольного фильтра
Програмеый pin 16, обозначение на модуле D0. Блок схема подключения.

В случае если вентилятор имеет отдельный порт PWM:
![]() | ![]() |
то можно подключить порт PWN напрямую в порт модуля.
Скетч
/*
ESP8266
Climate controller for L72PC
1. zabbix
2. Sensors DS18B20 on D2 print on board (D4-program)
3. PWM carbon filer fan
*/
//Zabbix
#include <ESP8266ZabbixSender.h>
//Dallas
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 4
#define TEMPERATURE_PRECISION 12
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int numberOfDevices;
DeviceAddress tempDeviceAddress;
//Zabbix
ESP8266ZabbixSender zSender;
/* WiFi settings */
const char* ssid = "ИМЯ_ВАШЕЙ_WI-FI_СЕТИ";
const char* password = "ПАРОЛЬ";
/* Zabbix server setting */
#define SERVERADDR XX, XX, XX, XX // Zabbix server Address
#define ZABBIXPORT 10051 // Zabbix erver Port
#define ZABBIXAGHOST "l72pc" // Zabbix item's host name
boolean checkConnection();
IPAddress ip(192,168,0,XX); //статический IP
IPAddress gateway(192,168,0,1);
IPAddress subnet(255,255,255,0);
IPAddress primaryDNS(192, 168, 0, 1); //optional
IPAddress secondaryDNS(8, 8, 8, 8); //optional
int pwm = 16; //Pin 16 For PWM (D0 on board)
void setup() {
Serial.begin(9600);
sensors.begin();
numberOfDevices = sensors.getDeviceCount();
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
Serial.println();
Serial.print("Connecting to "); // "Подключаемся к "
Serial.println(ssid);
WiFi.config(ip, gateway, subnet, primaryDNS, secondaryDNS);
WiFi.begin(ssid, password);
zSender.Init(IPAddress(SERVERADDR), ZABBIXPORT, ZABBIXAGHOST); // Init zabbix server information
Serial.println("");
Serial.println("WiFi connected"); // "Подключение к WiFi выполнено"
Serial.println(WiFi.localIP());
pinMode(pwm, OUTPUT); //PWM carbon filter
}
// the loop function runs over and over again forever
void loop() {
sensors.requestTemperatures();
float tempinside;
sensors.getAddress(tempDeviceAddress, 0);
sensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION);
tempinside = sensors.getTempC(tempDeviceAddress);
float tempoutside;
sensors.getAddress(tempDeviceAddress, 1);
sensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION);
tempoutside = sensors.getTempC(tempDeviceAddress);
float tempproff;
sensors.getAddress(tempDeviceAddress, 2);
sensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION);
tempproff = sensors.getTempC(tempDeviceAddress);
//PWN
int pwmspeed = map(tempproff, 25, 35, 0, 255);
if (pwmspeed<60) {pwmspeed=60;}
if (pwmspeed>255) {pwmspeed=255;}
analogWrite(pwm, pwmspeed);
Serial.print("Temp Inside: ");
Serial.print(tempinside);
Serial.print("°C; ");
Serial.print("Temp Outside: ");
Serial.print(tempoutside);
Serial.print("°C; ");
Serial.print("Temp proff: ");
Serial.print(tempproff);
Serial.print("°C; ");
Serial.print("PWM Fan: ");
Serial.print(pwmspeed);
Serial.print("; ");
Serial.println();
checkConnection();
zSender.ClearItem();
zSender.AddItem("tempinside", (float)tempinside);
zSender.AddItem("tempoutside", (float)tempoutside);
zSender.AddItem("tempproff", (float)tempproff);
zSender.AddItem("pwmspeed", (int)pwmspeed);
if (zSender.Send() == EXIT_SUCCESS) { // Send zabbix items
Serial.println("ZABBIX SEND: OK");
} else {
Serial.println("ZABBIX SEND: NG");
}
zSender.ClearItem();
Serial.println();
delay(5000);
}
boolean checkConnection() {
int count = 0;
Serial.print("Waiting for Wi-Fi connection");
while (count < 3) {
if (WiFi.status() == WL_CONNECTED) {
Serial.println();
Serial.println("Connected!");
return (true);
}
delay(500);
Serial.print(".");
count++;
}
Serial.println("Timed out.");
return false;
}
Подключение датчика двери
Пока это будет просто кнопка (контакт).
Кнопка к arduino подключена с подтяжкой к GND, по схеме:

Блок схема подключения. Програмный 5pin, на модуле D1 (DoorSensor).

Скетч можно скачать отсюда.
Подключение датчика оборотов вентилятора от угольного фильтра
Во всех компьютерных вентиляторах у которых три и более проводав стоит датчик Холла. И его можно использовать для тахометра. При питании вентилятора через ШИМ снимать показания с датчика оборотов можно. Получается, что при одновременно работающем ШИМ и interrupt тем более на разных пинах.
Принцип подключения основан на схеме взятой отсюда резистор 10к, у меня работало и с 220Ом, причем даже лучше чем с 10к, когда 10к обороты в тясчи раз больше поулчаются.

Подключается к цифровому порту D8 (програмный pin 15, на рисунке D5). Блок схема контроллера:

Скетч тут в этом скетче все предыдущие шаги.
Подключение реле света.
В проекте используется реле марки Fotek SSR-25 DA.

Блок-схема подключения реле к модулю описана в этой статье.
Диод 1N4148.
Порт D6 (програмный pin 12).
Транзистор D882.

Скетч в котором содержится код настройк для всех предыдущих шагов включая реле (zabbix, DS18B20, PWM, Door, RPM, Реле)
Подключение детектора 220В
Первоисточник. В первоисточнике есть ошибка в схеме, неправильно ориентирован диод. Схема чувствительна к неправильному подключению к 220В, важно соблюдать фазу и ноль.
Порт на плате D3 (програмный pin 0).
Оптопара: PC817
Резистор: 130кОм 2Вт
Диод: 1N4007
Блок схема:

Код с датчиком 220В.

