Системник-гроубокс на 72Вт

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

580 x 220 x 425мм

Внешние размеры:

Высота: 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.

Ссылка на али.

Основные задачи контроллера климата

  1. Собирает температуру: внутри, снаружи и температуру алюминиевого радиатора;
  2. На основе температуры управляет оборотами вентилятора угольного фильтра (он же вытяжной вентилятор);
  3. Фиксирует фактическое наличие света внутри.
  4. Мониторит датчик открытия боковой крышки системника (для оповещения в телегам);
  5. Собирает информацию о фактических оборотах вентиляторов (угольного фильтра и обдувочного вентилятора) для определния проблем с вращением;
  6. Управляет светильником включая или выключая часть света для предотварщения перегрева.
  7. Определяет в каком режиме «день/ночь» находится таймер.
  8. Передача собранных данных на 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 (программный)На плате
0D3 (220В)
2D4
4D2 (ONE_WIRE_BUS)
5D1 (DoorSensor)
12D6 (Relay)
13D7
14D5
15D8 (rpm carbon)
16D0 (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.

Реле Фотек Твердотельное SSR-25 DA
Fotek SSR-25 DA

Блок-схема подключения реле к модулю описана в этой статье.

Диод 1N4148.

Порт D6 (програмный pin 12).

Транзистор D882.

Скетч в котором содержится код настройк для всех предыдущих шагов включая реле (zabbix, DS18B20, PWM, Door, RPM, Реле)

Подключение детектора 220В

Первоисточник. В первоисточнике есть ошибка в схеме, неправильно ориентирован диод. Схема чувствительна к неправильному подключению к 220В, важно соблюдать фазу и ноль.

Порт на плате D3 (програмный pin 0).

Оптопара: PC817

Резистор: 130кОм 2Вт

Диод: 1N4007

Блок схема:

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

Добавить комментарий