Arduino + NAS + MySQL + Сайт = Домашняя метеостанция и не только

lyryks

✩✩✩✩✩✩✩
17 Фев 2020
4
2
Доброго времени суток.

Решил рассказать о своем проекте, может кому пригодится. Понимание для чего всё это у Вас будет после прочтения. Описание железа и ПО, используемого в проекте.
Пишу первый раз, сильно не пинайте. Если необходимо что то дополнить, то пишите.

- Начнем с NAS, использовать готовые решения не сказать что дорого, просто они не поддаются модернизации. Поэтому было принято решение использовать компьютер, но не простой, а мини, и по размеру вышло ничем не больше NAS.

NAS на Xpenology помогает мне решить несколько задач:
  1. Хранение файлов, как нужных так и не совсем. При наличии двух дисков поднимаем RAID для отказоустойчивости.
  2. Сервер DNLA, с телевизора, планшета, телефона или утюга получаю доступ к фото, видео, музыке
  3. Torrent качалка.
  4. Свой сайт, чисто для себя, а может быть и не только
Комплектующие:
  • Материнская плата 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 - чисто символически, без цены
По итогу вышло 16300 если брать так сказать новое. Если не брать SSD и проц б/у, то выходт 12500, что все равно дешевле того же (не реклама) - Сетевое хранилище Synology Disk Station DS218j (14000).

В моей же сборке я могу спокойно установить более мощный проц, добавить оперативной памяти аж до 32Gb. Корпус в разработке, собрано условно на коленке, но работает прекрасно.
IMG_20200229_183624.jpg


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

Очень подробно по поводу установки XPenology не хотелось бы писать, на просторах интернета много инструкций.
На флешку заливается загрузчик XPenology. Данная флешка должна быть установленной в качестве загрузки по умолчанию в BIOS и желательно быть вставлена всегда в компьютер. Да, можно её выдернуть после загрузки системы, она там не нужна во время работы, но если будет внеплановое отключение электричества, то система не запустится, хотя на материнке можно выставить автовлючение после сбоя питания.

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

Настройки MariaDb.JPG
Немного поясню. На Synology можно установить как MariaDB5 так и MariaDB10. Если их устанавливать одновременно, то порты должны быть разные. И так видимо задумали что MariaDB5 это 3306, как стандартный порт подключения к MySQL, а MariaDB10 выделили 3307, ну либо можно самому прописать любой порт.

Добавляем нового пользователя. Самое главное дать доступ с любой хост %, либо дать более жесткие ограничения.
phpMyAdmin.JPG

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

В скетче отключил 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];
}

MySQL описание таблицы.JPG

Итог
Итог всех стараний.JPG
Пока есть только две проблемы, это 1 - после перезагрузки маршрутизатор Wemos не подключается к WiFi и соответственно не пишет в SQL. И 2 - после перезагрузки хранилища - SQLConnect теряется и так же перестает писать в базу.
Может кто что подскажет, как обойти эту проблему. Нормально ли проверять каждый раз перед записью в базу наличие подключения?

Для себя вижу большой потенциал в данном проекте.
- Можно добавить еще несколько Wemos D1 mini + BME280, в каждую комнату например. Создать карту на WordPress чтобы видеть показания как на карте квартиры, уже пробую. Даже есть небольшие успехи.
- Можно добавить Wemos D1 mini, который будет слушать показания с MySQL и запускать реле.
 
Последнее редактирование:
  • Лойс +1
Реакции: Aleks-SPb и Arhat109

kalobyte

★★★✩✩✩✩
1 Янв 2020
725
147
жуть какая-то на квадратных колесах
все давно уже изобретено https://grafana.com/

кстати хренолоджи новый вышел на 6.2.2 и там мануал другой уже
вчера только изучал тему и пора апдейтиться
 
  • Лойс +1
Реакции: Aleks-SPb

lyryks

✩✩✩✩✩✩✩
17 Фев 2020
4
2
@kalobyte, Не исключено :). Но я просто описал свой проект и написал вдруг кто-то для себя что то возьмет.
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
725
147
ну я углядел плагин для вп с таблицами, может пригодится где
не думал, что такое есть под него