• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP8266 показания давления с BMP180 в архив на месяц

mr_smit

New member
Здравствуйте. Есть плата ESP-01 и датчик давления BMP180. При помощи google и Arduino IDE залил в ESP8266 код, который считывает показания давления и отображает на web странице. Есть ли возможность сохранять показания с интервалом в 1 час и вести архив хотя бы на пару недель? Чтобы потом отследить динамику изменения по датам в виде графика? Т.е. чтобы это было полностью на ESP8266 которая будет подключена к моему домашнему роутеру. На данный момент я вижу на странице показания с датчика которые обновляются один раз в 5 сек. Хотелось бы добавить внизу кнопку "архив" при нажатии на которую появляется окошко с выбором желаемого интервала времени и рисуется график по архивным значениям. Может добавить на I2C шину EEPROM? Но как в ней организовать базу данных?

Screenshot.jpg
 

nikolz

Well-known member
Здравствуйте. Есть плата ESP-01 и датчик давления BMP180. При помощи google и Arduino IDE залил в ESP8266 код, который считывает показания давления и отображает на web странице. Есть ли возможность сохранять показания с интервалом в 1 час и вести архив хотя бы на пару недель? Чтобы потом отследить динамику изменения по датам в виде графика? Т.е. чтобы это было полностью на ESP8266 которая будет подключена к моему домашнему роутеру. На данный момент я вижу на странице показания с датчика которые обновляются один раз в 5 сек. Хотелось бы добавить внизу кнопку "архив" при нажатии на которую появляется окошко с выбором желаемого интервала времени и рисуется график по архивным значениям. Может добавить на I2C шину EEPROM? Но как в ней организовать базу данных?

Посмотреть вложение 9749
Вы можете сохранить данные в RAM RTC ESP, либо во флеш , но для этого надо уметь программировать хотя бы на ардуино.
Можно данные сохранить на внешнем сервере либо на своем компе.
 

svs2007m

Active member
или простейший вариант на приложении Blynk. Таблицы, графики... т.д. Что-то "сильно умное" не получится но для начала пойдет. :)
 

nikolz

Well-known member
самое простое собирать данные на компьютере через USB в лог файл терминала , например, TeraTerm.
Даже wifi не требуется.
Можно написать простейшую программу на луа или питоне или джава и собирать данные на смартфоне
В отличии от халявных программ blynk и пр Вы не только научитесь собирать данные но и программировать все что захотите , а так же сможете не только тупо смотреть на картинки но и обработать данные любой математикой на Excel Matlab или R.
 

mr_smit

New member
Вы можете сохранить данные в RAM RTC ESP, либо во флеш
Я это всё понимаю. Не нашел примеров. Не хочу никаких внешних серверов.
самое простое собирать данные на компьютере через USB в лог файл терминала
Для этого нужно держать включенным компьютер.

Вопрос был именно как организовать это силами самого ESP (либо внешний EEPROM). Законченное устройство "логгер" давления с доступом по Wi-Fi. Возможно ли.

Пока вижу это только как внешняя I2C EEPROM и как то на javascript рисовать график, доставая данные из EEPROM. Но каких либо примеров на этот счет не нашел. Может плохо искал.
 

Вложения

edw

New member
Хотел предложить облачный mqtt сервер, это было бы самое простое решение без программирования и без внешней I2C памяти
Не хочу никаких внешних серверов.
Ну, раз такое дело... Нужно писать код. Если не предполагается перебоев с питанием, то данные удобно хранить в оперативке, один раз в час это совсем не много. Можно изредка скидывать данные в файл используя библиотеку SPIFFS. Чертить график, проще всего на js отдал данные, а рисованием занимается браузер.
 

mr_smit

New member
Можно изредка скидывать данные в файл используя библиотеку SPIFFS. Чертить график, проще всего на js отдал данные, а рисованием занимается браузер.
Это всё понятно. КАК? Примеры? С привязкой ко времени и дате. Дату и время можно хранить в BCD формате. Изменение давления происходит в небольших пределах. Поэтому для хранения можно использовать 8 битную переменную, а давление вычислять как 600+int8. Т.е. 748 мм рт.ст. будет лежать в базе как 148 или 0x94.

Получается архивная запись: дата 21.08.20, время 09:00, давление 748
Будет выглядеть как: 0x21 0x08 0x20 0x09 0x00 0x94

И займет 6 байт. Запись каждый час. 24*6=144 байта в день. 144*30=4320 байт (~ 4кБ) в месяц . Куда/как сохранять и как отобразить? Желательно с примерами кода, если кто знает. Может кто делал подобное. Пока гуглю по запросу "arduino eeprom data logger". Но и отрисовка в браузере мне пока не ясна. Там используют библиотеку Chart.js. Но как её загрузить.
 

nikolz

Well-known member
Это всё понятно. КАК? Примеры? С привязкой ко времени и дате. Дату и время можно хранить в BCD формате. Изменение давления происходит в небольших пределах. Поэтому для хранения можно использовать 8 битную переменную, а давление вычислять как 600+int8. Т.е. 748 мм рт.ст. будет лежать в базе как 148 или 0x94.

Получается архивная запись: дата 21.08.20, время 09:00, давление 748
Будет выглядеть как: 0x21 0x08 0x20 0x09 0x00 0x94

И займет 6 байт. Запись каждый час. 24*6=144 байта в день. 144*30=4320 байт (~ 4кБ) в месяц . Куда/как сохранять и как отобразить? Желательно с примерами кода, если кто знает. Может кто делал подобное. Пока гуглю по запросу "arduino eeprom data logger". Но и отрисовка в браузере мне пока не ясна. Там используют библиотеку Chart.js. Но как её загрузить.
Вы выбрали очень плохой модуль.
Рано или поздно но придется его выкинуть.
посмотрите эту статью
этот вариант, сейчас можно взять Wemos mini d1, самое то, не только для начинающих, но и для быстрой разработки алгоритмов.
 

CodeNameHawk

Moderator
Команда форума
Это всё понятно. КАК?
В Arduino IDE есть пример LitteleFS и WebBrowser.
https://github.com/esp8266/Arduino/blob/master/libraries/LittleFS/examples/SpeedTest/SpeedTest.ino

Для построения графика попробуйте использовать
https://d3js.org/
https://bl.ocks.org/d3noob/402dd382a51a4f6eea487f9a35566de0

Данные записываете в файл в виде текста с запятыми.
http://learnjsdata.com/read_data.html

Или используйте JSON
[
{"name":"Andy Hunt",
"title":"Big Boss",
"age": 68,
"bonus": true
},
{"name":"Charles Mack",
"title":"Jr Dev",
"age":24,
"bonus": false
}
]

Loading employees.json with d3.json:

d3.json("/data/employees.json").then(function(data) {
console.log(data[0]);
});
 
Последнее редактирование:

nikolz

Well-known member
еще вариант - это Lua
если учиться еще способны, то здесь куча примеров для ESP

Lua Flash Store (LFS)
В сентябре 2018 года была введена поддержка Lua Flash Store (LFS). LFS позволяет Lua-коду и связанным с ним постоянным данным выполняться непосредственно из флэш-памяти; точно так же, как выполняется сама прошивка. Теперь это позволяет разработчикам NodeMCU создавать Lua-приложения с кодом Lua объемом до 256 кб и константами только для чтения, выполняемыми из flash. Вся оперативная память доступна для чтения-записи данных!
Файловая система SPIFFS
Проект NodeMCU использует SPIFFS файловая система для хранения файлов во флэш-чипе. Технические подробности о том, как это настроено, можно найти ниже, а также различные варианты времени сборки.

spiffsimg-манипулирование образами дисков Флэш-файловой системы SPI
Вы когда-нибудь хотели, чтобы вы могли подготовить изображение SPIFFS в автономном режиме и прошить все это вещь на хранение вашего микропроцессора вместо кропотливой загрузки файл за файлом через ваше приложение на микро? С spiffsimg вы можете!

NodeMCU использует файловую систему SPIFFS, которая знает, насколько она велика - то есть когда вы строите файловую систему изображение, оно должно поместиться в флэш-чип, и его нельзя расширить после вспышки. Очень важно придать spiffimgинструменту правильный размер. Вы можете предоставить либо -cвариант, либо оба -U-Sварианта и.
 

edw

New member
Highcharts вам в помощь для построения графиков, вот что получилось нарисовать с датчика температуры в загородном домеIMG_1208.jpg
 

nikolz

Well-known member
Highcharts вам в помощь для построения графиков, вот что получилось нарисовать с датчика температуры в загородном домеПосмотреть вложение 9757
а теперь покажите например распределение температур ,
медиану,
максимум и минимум,
период основных колебаний
за месяц, неделю.
 

svs2007m

Active member
А давайте еще PVVX позовем или =АК= . А то как-то скучно стало. Есть менение мое и не правильное. Да nikolz ?:) Да и мы "попкорном' запасемся. :)
В дискуссии рождается истина
 

nikolz

Well-known member
А давайте еще PVVX позовем или =АК= . А то как-то скучно стало. Есть менение мое и не правильное. Да nikolz ?:) Да и мы "попкорном' запасемся. :)
В дискуссии рождается истина
заметьте, это Вы сказали.
------------------------
Полагаю, Вы поняли , что халява и есть халява.
Кроме созерцания картинок и праздника тщеславия и хвастовства этими картинками перед другими Вы ничего конкретного решить таким способом не сможете.
Верно?
Если нет, то объясните - зачем Вам эти картинки? И как у Вас используется 32 битный процессор ESP.
Для того чтобы тупо прочитать данные с датчика и отправить их на сайт нет надобности даже в 16 битном процессоре.
 

mr_smit

New member
В общем сделал. Использовал Arduino IDE 1.8.13 и штатные библиотеки EDB и NTPClient. При запуске в ESP8266 создается новая таблица (база данных) на 340 строк. В таблицу заносятся значения из структуры:
C++:
struct Data {
  char date[11];
  char tim[9];
  int  Pressure;
}
При наличии соединения с интернетом, узнаю текущую дату/время и каждый час записываю данные в таблицу. При этом доступна Web страница с текущим значением давления. Если нажать на надпись "давление", то попадаем на страницу с архивом. График рисуется при помощи dimple скрипта. Сама библиотека dimple подтягивается из интернета непосредственно в браузере. Она же занимается и расстановкой значений в хронологическом порядке. Если подключения к интернету нет, то в базу значения не сохраняем, отображаем только текущее значение. Номер последнего "сохранения" хранится в 340 строке таблицы. Чтобы после отключения/включения питания знать в какую строку таблицы продолжать запись. Итого 339 / 24 ~ 14 дней. Для скриншота, сделал интервал сохранения 1 мин, чтобы подсобрать данные.

Screenshot_2020-09-01-10-31-14-980_com.android.chrome.jpg Screenshot_2020-09-01-12-11-42-601_com.android.chrome.jpg
 

Вложения

mr_smit

New member
Единственное не пойму как в dimple (js надстройка над d3) сделать надписи по оси Х пореже. Чтобы они не накладывались друг на друга.

JavaScript:
<!DOCTYPE HTML>
<html><head>
<meta content = "text/html; charset=UTF-8" http-equiv = "content-type">
<script src="http://d3js.org/d3.v5.min.js"></script>
<script src="http://dimplejs.org/dist/dimple.v2.3.0.min.js"></script>
</head><body><script type="text/javascript">
var svg = dimple.newSvg("body", "100%", 910);
var data = [
{ "DateTime":"2020-09-01T11:20:56", "pressure":752},
{ "DateTime":"2020-09-01T11:21:00", "pressure":752},
{ "DateTime":"2020-09-01T11:22:00", "pressure":752},
{ "DateTime":"2020-09-01T11:23:00", "pressure":752},
{ "DateTime":"2020-09-01T11:28:00", "pressure":752},
{ "DateTime":"2020-09-01T11:29:00", "pressure":752},
{ "DateTime":"2020-09-01T11:30:00", "pressure":752},
{ "DateTime":"2020-09-01T11:31:00", "pressure":752},
{ "DateTime":"2020-09-01T11:32:00", "pressure":752},
{ "DateTime":"2020-09-01T11:33:00", "pressure":752},
{ "DateTime":"2020-09-01T11:34:00", "pressure":752},
{ "DateTime":"2020-09-01T11:35:00", "pressure":752},
{ "DateTime":"2020-09-01T11:36:00", "pressure":752},
{ "DateTime":"2020-09-01T11:37:00", "pressure":752},

{ "DateTime":"2020-01-01T00:00:00", "pressure":0}
];
var myChart = new dimple.chart(svg, data);
myChart.setBounds(70, 30, "95%", 600);
var x = myChart.addCategoryAxis("x", "DateTime");
var y = myChart.addMeasureAxis("y", "pressure");
x.showGridlines = true;
x.fontSize = "auto";
x.title = "Дата/Время";
y.overrideMin = 700;
y.overrideMax = 800;
y.fontSize = "auto";
y.title = "Давление в мм рт.ст.";
myChart.addSeries(null, dimple.plot.line);
myChart.draw();
</script></body>
 

nikolz

Well-known member
В общем сделал. Использовал Arduino IDE 1.8.13 и штатные библиотеки EDB и NTPClient. При запуске в ESP8266 создается новая таблица (база данных) на 340 строк. В таблицу заносятся значения из структуры:
C++:
struct Data {
  char date[11];
  char tim[9];
  int  Pressure;
}
При наличии соединения с интернетом, узнаю текущую дату/время и каждый час записываю данные в таблицу. При этом доступна Web страница с текущим значением давления. Если нажать на надпись "давление", то попадаем на страницу с архивом. График рисуется при помощи dimple скрипта. Сама библиотека dimple подтягивается из интернета непосредственно в браузере. Она же занимается и расстановкой значений в хронологическом порядке. Если подключения к интернету нет, то в базу значения не сохраняем, отображаем только текущее значение. Номер последнего "сохранения" хранится в 340 строке таблицы. Чтобы после отключения/включения питания знать в какую строку таблицы продолжать запись. Итого 339 / 24 ~ 14 дней. Для скриншота, сделал интервал сохранения 1 мин, чтобы подсобрать данные.

Посмотреть вложение 9801 Посмотреть вложение 9802
если таблица изначально очищается, то номер последнего "сохранения" не надо сохранять.
если таблица изначально не очищается, то первую свободную ячейку пишем ноль, а новое значение сохраняем в первой ячейки, содержащей ноль.
если в таблицу пишите дату, то записывая ноль в ячейку для нового значения, таблицу можно сделать циклической. При достижении конца таблицы, пишем ноль в первую ячейку. В итоге будет скользящее окно наблюдения.
 

mr_smit

New member
если таблица изначально очищается, то номер последнего "сохранения" не надо сохранять.
если таблица изначально не очищается, то первую свободную ячейку пишем ноль, а новое значение сохраняем в первой ячейки, содержащей ноль.
если в таблицу пишите дату, то записывая ноль в ячейку для нового значения, таблицу можно сделать циклической. При достижении конца таблицы, пишем ноль в первую ячейку. В итоге будет скользящее окно наблюдения.
Ничего не понял. Какой ноль куда записывать вы предлагаете?
 
Сверху Снизу