Доброго времени суток.
Решил рассказать о своем проекте, может кому пригодится. Понимание для чего всё это у Вас будет после прочтения. Описание железа и ПО, используемого в проекте.
Пишу первый раз, сильно не пинайте. Если необходимо что то дополнить, то пишите.
До этого брал MH-Z19B, не понравилось с ним работать (показания что-то слишком кривые). Да он дешевле, но он проигрывает, т.к. T6703 и BME280 и дисплей можно подключить параллельно по I2C.
Дисплей мне больше нужен, чтобы видеть показания с датчиков в текущий момент. Но вот ночью я не буду в него пялиться, дабы понять сколько там CO2 и температура с влажностью. Цель всего этого - это сбор информации, обработка и принятие решений, выводы.
На данный момент в стадии обкатки.
Итог

Пока есть только две проблемы, это 1 - после перезагрузки маршрутизатор Wemos не подключается к WiFi и соответственно не пишет в SQL. И 2 - после перезагрузки хранилища - SQLConnect теряется и так же перестает писать в базу.
Может кто что подскажет, как обойти эту проблему. Нормально ли проверять каждый раз перед записью в базу наличие подключения?
Для себя вижу большой потенциал в данном проекте.
- Можно добавить еще несколько Wemos D1 mini + BME280, в каждую комнату например. Создать карту на WordPress чтобы видеть показания как на карте квартиры, уже пробую. Даже есть небольшие успехи.
- Можно добавить Wemos D1 mini, который будет слушать показания с MySQL и запускать реле.
Решил рассказать о своем проекте, может кому пригодится. Понимание для чего всё это у Вас будет после прочтения. Описание железа и ПО, используемого в проекте.
Пишу первый раз, сильно не пинайте. Если необходимо что то дополнить, то пишите.
- Начнем с NAS, использовать готовые решения не сказать что дорого, просто они не поддаются модернизации. Поэтому было принято решение использовать компьютер, но не простой, а мини, и по размеру вышло ничем не больше NAS.
NAS на Xpenology помогает мне решить несколько задач:
В моей же сборке я могу спокойно установить более мощный проц, добавить оперативной памяти аж до 32Gb. Корпус в разработке, собрано условно на коленке, но работает прекрасно.

NAS на Xpenology помогает мне решить несколько задач:
- Хранение файлов, как нужных так и не совсем. При наличии двух дисков поднимаем RAID для отказоустойчивости.
- Сервер DNLA, с телевизора, планшета, телефона или утюга получаю доступ к фото, видео, музыке
- Torrent качалка.
- Свой сайт, чисто для себя, а может быть и не только
- Материнская плата GIGABYTE GA-H110M-D3H R2 - её стоимость примерно 6000р
- Процессор Intel Celeron G3930 OEM - 3000р, но если поискать у "Вити", то можно и за 1000 взять.
- Кулер для процессора Arctic Cooling Alpine 12 LP [ACFAN00029A] - 700р, но тут вообще не принципиально какой, мне он просто показался низким.
- 128 ГБ SSD M.2 накопитель Intel 545s Series [SSDSCKKW128G8X1] - 1800р. Брал, если вдруг захочу поднять на этом компе какое то виндовое решение, например Windows Server 2008.
- Оперативная память любая DDR4 4 Gb - 1100р
- Блок питания 90W - 1000р
- Диск для хранения, HDD, например 500Gb, 2.5, - 2700р
- Флешка 1Gb - чисто символически, без цены
В моей же сборке я могу спокойно установить более мощный проц, добавить оперативной памяти аж до 32Gb. Корпус в разработке, собрано условно на коленке, но работает прекрасно.

- Wemos D1 Mini - 150р
- Датчик BME280 - температура, влажность, давление - 200р
- NDIR CO2 модуль T6703 датчик углекислого газа - 2000р.
- Дисплей SSD1306 Привод IC 128*64, 250р
До этого брал MH-Z19B, не понравилось с ним работать (показания что-то слишком кривые). Да он дешевле, но он проигрывает, т.к. T6703 и BME280 и дисплей можно подключить параллельно по I2C.
Дисплей мне больше нужен, чтобы видеть показания с датчиков в текущий момент. Но вот ночью я не буду в него пялиться, дабы понять сколько там CO2 и температура с влажностью. Цель всего этого - это сбор информации, обработка и принятие решений, выводы.
На данный момент в стадии обкатки.

Очень подробно по поводу установки XPenology не хотелось бы писать, на просторах интернета много инструкций.
На флешку заливается загрузчик XPenology. Данная флешка должна быть установленной в качестве загрузки по умолчанию в BIOS и желательно быть вставлена всегда в компьютер. Да, можно её выдернуть после загрузки системы, она там не нужна во время работы, но если будет внеплановое отключение электричества, то система не запустится, хотя на материнке можно выставить автовлючение после сбоя питания.
Скачиваем образ системы. Я брал synoboot-ds918.
Заливаем его на флешку с помощью программы Win32 Disk Imager, программа бесплатная, без труда находится в яндексе.
Загружаем сервер с флешки, выбираем пункт по-умолчанию и ждем загрузки системы.
После загрузки, запускаем Synology Assistant, находим в списке свой NAS и устанавливаем на него ОС (файлик PAT). Тут я брал DSM_DS918+_24922.pat.
После первичной настройки файлохранилища, я установил Wordpress, MariaDB10, phpMyAdmin, Web Station, Download Station.

На флешку заливается загрузчик XPenology. Данная флешка должна быть установленной в качестве загрузки по умолчанию в BIOS и желательно быть вставлена всегда в компьютер. Да, можно её выдернуть после загрузки системы, она там не нужна во время работы, но если будет внеплановое отключение электричества, то система не запустится, хотя на материнке можно выставить автовлючение после сбоя питания.
Скачиваем образ системы. Я брал synoboot-ds918.
Заливаем его на флешку с помощью программы Win32 Disk Imager, программа бесплатная, без труда находится в яндексе.
Загружаем сервер с флешки, выбираем пункт по-умолчанию и ждем загрузки системы.
После загрузки, запускаем Synology Assistant, находим в списке свой NAS и устанавливаем на него ОС (файлик PAT). Тут я брал DSM_DS918+_24922.pat.
После первичной настройки файлохранилища, я установил Wordpress, MariaDB10, phpMyAdmin, Web Station, Download Station.

В вордпресс я добавил плагин wpDataTables-v2.8.1(найти легко, а иначе бесплатный не даст сделать подключение к базе, ограничения), который позволяет создать и настроить подключение к нашей базе, и потом стандартными SQl запросами выдергивать данные с базы и выводить их на страницу нашего сайта в Wordpress в виде таблиц и графиков (настривается даже автообновление данных).
Можно вывести фильтры и обрабатывать данные прямо на сайте, анализировать.


Можно вывести фильтры и обрабатывать данные прямо на сайте, анализировать.


В скетче отключил Serial порт, он мне нафиг не нужен. Загрузка скетчей по Wifi с помощью OTA.
#include <Wire.h>
#include <ESP8266WiFi.h>
#include <Adafruit_BME280.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#define ADDR_6713 0x15
#define SEALEVELPRESSURE_HPA (1013.25)
byte data[6];
int CO2ppmValue;
IPAddress server_addr(192, 168, 0, 200); // IP of the MySQL *server*
char user[] = "ваш пользователь в mysql";
char password[] = "ваш пароль";
String _ssid = "ваша точка доступа";
String _password = "ваш пароль от точки доступа";
const float SEA_LEVEL_PRESSURE_HPA = 1013.25;
Adafruit_BME280 bme;
WiFiClient client;
MySQL_Connection conn((Client *)&client);
char query[128];
void setup() {
WiFi.mode(WIFI_STA);
Wire.begin();
WiFi.begin(_ssid.c_str(), _password.c_str());
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
delay(2000);
}
bme.begin(0x76);
ArduinoOTA.onStart([]() {
String type;
if (ArduinoOTA.getCommand() == U_FLASH) {
type = "sketch";
} else { // U_FS
type = "filesystem";
}
});
ArduinoOTA.begin();
conn.connect(server_addr, 3307, user, password);
}
void loop() {
ArduinoOTA.handle();
float tempC = bme.readTemperature();
float humidity = bme.readHumidity();
float pressurePascals = bme.readPressure();
GetCO2PPM();
char INSERT_SQL[] = "INSERT INTO arduino.information (PPM, TEMPERATURE, HUMIDITY) VALUES (%d, %f, %f);";
char query[255];
sprintf(query, INSERT_SQL, CO2ppmValue, tempC, humidity);
MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
cur_mem->execute(query);
delete cur_mem;
delay(15000);
}
void GetCO2PPM() {
Wire.beginTransmission(ADDR_6713);
Wire.write(0x04);
Wire.write(0x13);
Wire.write(0x8B);
Wire.write(0x00);
Wire.write(0x01);
Wire.endTransmission();
delay(10);
Wire.requestFrom(ADDR_6713, 4); // request 4 bytes from slave device
data[0] = Wire.read();
data[1] = Wire.read();
data[2] = Wire.read();
data[3] = Wire.read();
CO2ppmValue = ((data[2] & 0x3F ) << 8) | data[3];
}
#include <Wire.h>
#include <ESP8266WiFi.h>
#include <Adafruit_BME280.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#define ADDR_6713 0x15
#define SEALEVELPRESSURE_HPA (1013.25)
byte data[6];
int CO2ppmValue;
IPAddress server_addr(192, 168, 0, 200); // IP of the MySQL *server*
char user[] = "ваш пользователь в mysql";
char password[] = "ваш пароль";
String _ssid = "ваша точка доступа";
String _password = "ваш пароль от точки доступа";
const float SEA_LEVEL_PRESSURE_HPA = 1013.25;
Adafruit_BME280 bme;
WiFiClient client;
MySQL_Connection conn((Client *)&client);
char query[128];
void setup() {
WiFi.mode(WIFI_STA);
Wire.begin();
WiFi.begin(_ssid.c_str(), _password.c_str());
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
delay(2000);
}
bme.begin(0x76);
ArduinoOTA.onStart([]() {
String type;
if (ArduinoOTA.getCommand() == U_FLASH) {
type = "sketch";
} else { // U_FS
type = "filesystem";
}
});
ArduinoOTA.begin();
conn.connect(server_addr, 3307, user, password);
}
void loop() {
ArduinoOTA.handle();
float tempC = bme.readTemperature();
float humidity = bme.readHumidity();
float pressurePascals = bme.readPressure();
GetCO2PPM();
char INSERT_SQL[] = "INSERT INTO arduino.information (PPM, TEMPERATURE, HUMIDITY) VALUES (%d, %f, %f);";
char query[255];
sprintf(query, INSERT_SQL, CO2ppmValue, tempC, humidity);
MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
cur_mem->execute(query);
delete cur_mem;
delay(15000);
}
void GetCO2PPM() {
Wire.beginTransmission(ADDR_6713);
Wire.write(0x04);
Wire.write(0x13);
Wire.write(0x8B);
Wire.write(0x00);
Wire.write(0x01);
Wire.endTransmission();
delay(10);
Wire.requestFrom(ADDR_6713, 4); // request 4 bytes from slave device
data[0] = Wire.read();
data[1] = Wire.read();
data[2] = Wire.read();
data[3] = Wire.read();
CO2ppmValue = ((data[2] & 0x3F ) << 8) | data[3];
}
Итог

Пока есть только две проблемы, это 1 - после перезагрузки маршрутизатор Wemos не подключается к WiFi и соответственно не пишет в SQL. И 2 - после перезагрузки хранилища - SQLConnect теряется и так же перестает писать в базу.
Может кто что подскажет, как обойти эту проблему. Нормально ли проверять каждый раз перед записью в базу наличие подключения?
Для себя вижу большой потенциал в данном проекте.
- Можно добавить еще несколько Wemos D1 mini + BME280, в каждую комнату например. Создать карту на WordPress чтобы видеть показания как на карте квартиры, уже пробую. Даже есть небольшие успехи.
- Можно добавить Wemos D1 mini, который будет слушать показания с MySQL и запускать реле.
Изменено: