-
Публикации
99 -
Зарегистрирован
-
Посещение
-
Дней в лидерах
9
Сообщения, опубликованные пользователем post125
-
-
15.04.2019 в 10:55, Kitsum сказал:но с разовыми пропажами данных все сложнее
Добрый день!
Снизил частоту иницилизации шины до 1раза в час, на одной ESPке пропуски отсутствуют пока, на другой был однократный пропуск только на одном датчике (болело два датчика). Видимо, ProMini не любят инициализацию шины i2c.
Уперся в нехватку оперативной памяти. Можно добавить еще 19 датчиков, с 20-го ESP перестаёт строить суточный график из стандартных четырёх датчиков - ошибка "Во время выполнения запроса произошла ошибка. Код ответа:200 (ОК)"; графики отдельно по каждому датчику пока еще строит.
Проект на ESP32 на горизонте не виднеется?
-
18.04.2019 в 09:13, Kitsum сказал:Проверьте повторно этот код, возможно, как раз в конце суток, Вы пытаетесь писать за приделы массива, что приводит к краху.
Добрый день!
в sensors.h указано byte logSize = 144; , т.е. как и было, больше ничего не менял в скетче, связанного с графиками. Если index.htm не влияет на перезагрузки, тогда не знаю что смотреть. попробую еще отключить ProMini с NRF.
стал изменять частоту отправки на народный монитор, сбор данных с датчиков и частоту проверки шины. При установке проверки и инициализации датчиков на 10 минут, сбора данных с датчиков 1, 3, 6 минут (с уличного датчика данные передаются каждые 3 минуты) на графике народного монитора обнаружил что ошибочные(нулевые ) значения длятся 10 минут. Изменил проверку шины и инициализацию датчиков на 20 минут, ошибочные данные на графике длятся от 20минут. Ошибки появляются как на народном мониторе, так и на графиках ESPшки , причём время появления ошибки разное на всех графиках. Можно ли вообще отключать проверку шины? Может проверка не дружит с ProMini?
ошибка длительностью 10мин (проверка шины и инициализация датчиков на 10 минут, сбора данных с датчиков 6 минут)
-
5 часов назад, Kitsum сказал:Проверьте повторно этот код, возможно, как раз в конце суток, Вы пытаетесь писать за приделы массива, что приводит к краху.
Добрый день! Ничего не делал, перестали перезагружаться. Видимо, код адаптировался. Понаблюдаю еще.
-
Добрый день! Благодарю за отзывчивость! Я Вас уже, наверное, достал своими вопросами. Програмный сенсор памяти я не убирал и на одной ESP добавил график на него. Сколько не смострел, значения не выходят за диапазон 49к-52к.
там где ровно - примерно 51100-51200, где пики - примерно 51700.
когда происходит перезагрузка непонятно, но где-то к концу суток построения графика. Ранее пытался поднять частоту сбора данных на графики, как-то не получилось. Вроде бы вернул всё обратно. Попробую перепроверить файл index.htm, может там что-то накосячил. Раньше такого, кажется , не было
16 часов назад, Kitsum сказал:рекомендую использовать 2.4.2.
это я помню, использую 2,4,2
-
4 часа назад, Kitsum сказал:Тут уже кому, что больше нравится
Благодарю за ответ и помощь! У меня что-то обе ESPки перезагружаются примерно 1 раз в сутки, поэтому корректного маштабирования графика мне не видать как своих ушей. Видимо, надо думать куда аккумулировать данные и оттуда строить гафики (что-то своё, не народномониторное). Нет ли какой-нибудь ссылки как построить простенький сервер для этих целей.
В следующей версии не планируете получать данные на ESP с удаленных датчиков через NRF подключенной к slave ардуине по i2c?
-
1 час назад, Kitsum сказал:String sensors::clear(float value) { if (value == 0) return "0"; if (value - (int16_t)value == 0) return String((int16_t)value); return String(value); }
Супер! Работает! Спасибо!
1 час назад, Kitsum сказал:Уверяю Вас, что все графики масштабируются одинаково
Да, после отправки сообщения я понял, что в процентном отношении колебания давления значительно меньше, чем остальных параметров, посему оно и выглядит прямой. А нельзя ли при запуске ESP первым значением с датчика заполнить все ячейки, а потом замещать их новыми данными? Тогда сразу графики будут презентабельными
-
20.06.2018 в 20:24, Kitsum сказал:График масштабируется автоматически и после суток работы приделы значений (в данном случае давления) будут скорректированы.
Добрый день! Подскажите, пожалуйста, возможно ли масштабировать график давления сразу по получении данных, как это происходит с другими графиками? Кроме как установить принудительно min и max пределы оси Y? Например, присваивать минимальному и максимальному значениям первое показание с датчика , а потом последующии данные сравнивать и, при необходимости, заменять ими минимальное и максимальное значения? А то как-то давление совсем грустно выглядит.
-
10 часов назад, Kitsum сказал:Медианный фильтр использует float для хранения значений, на практике он нужен только чтобы сгладит пиковые выбросы, спровоцированные кратковременными внешними изменениями в среде в которой находятся сенсоры.
отключение медианного фильтра дало только более плавные графики (в моей конфигурации);
Взял актуальную прошивку, заменил только считывание с датчиков температуры и влажности на арифметические прогрессии от -1,9 и от +1,9 с шагом +0,1 и -0,1 соответственно. Показания от -1 до +1 округляет до нуля как с фильтром, так и без фильтра. На круглых диаграммах данные в этом диапазоне отображаются корректно.
-
1 час назад, Kitsum сказал:Просмотрите эти данные и попытайтесь определить, получаете ли Вы эти значения уже округленными или это происходит во время создания самого графика.
в логе эти данные нулевые (те которые в диапазоне от -1 до +1)
-
11 минут назад, Kitsum сказал:Явного округления в коде не предусматривалось, давайте искать.
Благодарю за ответы, буду смотреть
-
08.10.2018 в 12:04, Kitsum сказал:Конечно есть нюансы, но они будут всегда
Добрый день! Сегодня ночью были удачные сочетания температури и влажности (иначе бы не заметил). Проанализировав графики ESP и народного монитора пришел к выводу, что ESP все данные от -1 до +1 округляет ровно к нулю. Подскажите, пожалуйста, где это отключить в программе?
Еще один вопрос№2, можно ли в графиках ESP смещать на графике оси У так, как примерно на народном монитере, чтобы было видно когда температура приближается к точке росы?
И еще один вопрос№3, в форуме не нашел, как можно изменить частоту передачи данных на narodmon? возможно, более редкая отправка данных решит проблему с эпизодичеккими отправками нулевой температуры на графике narodmon? не факт, но попробовать надо.
Благодарю за ответ
-
08.10.2018 в 12:04, Kitsum сказал:Конечно есть нюансы, но они будут всегда.
Добрый день! Подскажите, пожалуйста, для чего в Data два файла index - index.htm и index.htm.gz ? Как я понял , приоритет имеют сжатые файлы, но их неудобно редактировать. Можно ли удалить сжатый файл и пользоваться только index.htm? Благодарю за ответ.
-
-
3 часа назад, Kitsum сказал:На всякий случай скину ссылки на сам плагин Knob
Благодарю за ответ, посмотрю, но думаю, это на самом деле совсем не критично. Надо двигаться дальше.
Вот на народном мониторе проявились проблемка - сейчас через ProMini c NRF24 принимаются три параметра температура, влажность и напряжение батареи; В графиках батареи и влажности есть пропуски данных (в виде нулевых значений), причём в разное время, а в графике температуры таких пропусков нет. Странно это, ведь данные с ProMini считываются сразу всем массивом в память ESP, а потом из памяти раздаются. Может где-то ESPка не успевает их считать. Попробую снизить скорость обмена по i2c, если позволит библиотека. Хотя думаю, что проблема где-то в другом месте. Первым в массиве идёт батарея, тогда в других данных должна была бы возникнуть подобная ошибка в такое же время, как в батарее, но этого не наблюдается.
По датчикам ESP на шине i2c пропусков нет.
На локальных графиках пропусков то же нет.
-
08.10.2018 в 12:04, Kitsum сказал:Я не вижу причин не позволяющих реализовать то, что Вы задумали. Конечно есть нюансы, но они будут всегда.
С вашей помощью заработало! Ура! Маленький вопрос - можно ли отображать значение напряжения до 3-го знака после запятой? изменение .01 на .001 результата не даёт, хотя данные со slave имеют и третью цифру после запятой
knob_t *F2_0 = new knob_t(0, 125, ".001", "батт_улица", "В");
-
07.11.2018 в 18:45, Dmitry Moshalkov сказал:Как в Mac OS поменять тип - сходу не нашел. Поправил в index.htm:
Добрый день!
То же столкнулся с проблемой обновления прошивки на Mac OS. Изменил строку в index.htm на вашу
if(file.type !== "application/octet-stream" && file.type !== "application/macbinary") {
результата нет. Через Win7 обновление работает, но это неудобно, т.к. надо запускать Parallels. Можете подсказать, что еще надо подправить?
Спасибо, проблема решена: надо было внести изменения не index.htm, а в index.htm,gz
- 1
-
3 часа назад, Василий Залукаев сказал:Именно так.
спасибо
-
08.04.2019 в 14:14, Kitsum сказал:cron.add(cron::time_5s, getFullDataF1, true); sensors.add(F1_0, device::out, 0x01, "battery1", getPowerF1, true);
подскажите, пожалуйста, чтобы собирать данные с датчиков 1 раз в 3 минуты, надо написать "cron::time_3m"? :
void sensors_config() { Wire.begin(4, 5); cron.add(cron::time_3m, getFullDataF1, true); sensors.add(F1_0, device::out, 0x01, "battery1", getPowerF1, true); }
и добавить в файл chron.h ? :
time_3m = 10800,
или как-то иначе?
-
так, почему то, совсем не хочет ничего читать
byte i, y; byte b[4]; Wire.requestFrom(0x01, 32); while (Wire.available()) { b[i++] = Wire.read(); if (i >= 3) { i = 0; slaveF1[y++] = *(float*)b; if (y >= 7) return; } }
остановлюсь на своём варианте, упростив согласно вашим рекомендациям
Wire.requestFrom(0x01, 32); while (Wire.available()) { for (x=0;x<32; x++) { data[x] = Wire.read(); } byte x=0, z=0; for (byte y=0; y<8; y++ ){ for (byte z=0; z<4; z++&x++ ){ b[z] = data[x]; } F1[y] = *(float*)b; }
-
45 минут назад, Kitsum сказал:Остальные ошибки по невнимательности или спешке, думаю нет смысла на них указывать.
Благодарю за ответ! На ошибки крайне желательно указывать, если не сложно. Я не специалист в программировании, посему принимаю всё с глубокой благодарностью.
-
23.04.2017 в 17:02, EndWar сказал:SI7021
SHT31 - самые точные датчики из из тех, что я тестировал (ВМЕ280, HDC1080, SI7021, DHT, DS18, AM2320) в диапазоне от -25 до +70 гр.С. Не счтитая SHT35 (но он дороже всех этих) и Si7051(измеряет только температуру)
-
Добрый день!
Что-то не получается считать массив в user файле, если считывать данные со slave в loope, то их получается использовать и в вэб-интерфейсе они отображаются. В loop, наверное, не правильно вставлять считывание со slave , а то мастер будет постоянно долбать их. А счтитываие в user не хочет компилироваться, пишет " 'getSensorData1' was not declared in this scope". Я что-то делаю неправильно. Взгляните, пожалуйста.
Скрытый текст#define USERS_H #define ON true #define OFF false const int16_t I2C_MASTER = 0x42; byte data1[32]; byte data2[32]; byte b1[4]; byte b2[4]; float f1[8]={1,1,1,1,1,1,1,1}; float f2[8]={2,2,2,2,2,2,2,2}; byte x; /* Параметры индикаторов web интерфейса для плагина Knob Мин Макс Шаг Заголовок Ед. измер. |---------------------|----|------|------|------------------|---------| */ knob_t *T = new knob_t( -40, 1025, ".1", "Температура", "°C"); knob_t *P = new knob_t(-500, 9000, ".01", "Давление", "mm"); knob_t *H = new knob_t( 0, 100, ".01", "Влажность", "%"); knob_t *L = new knob_t( 0, 65000, "1", "Освещенность", "lx"); // knob_t *C = new knob_t( 0, 8192, "1", "eCO<sub>2</sub>", "ppm"); knob_t *F1_0 = new knob_t(0, 4, ".01", "батарея1", "V"); knob_t *F2_0 = new knob_t(0, 4, ".01", "батарея2", "V"); /***************************************************************************************************************************** * Ниже описан порядок инициализации сенсоров в зависимости от выбранной библиотеки, а также пример инициализации датчиков. * *****************************************************************************************************************************/ #include <BH1750.h> BH1750 BH1750; #include <BME280I2C.h> BME280I2C BME; // #include <SI7021.h> // SI7021 SI7021; void sensors_config() { Wire.begin(4, 5); sensors.add(L, device::out, 0x23, "out_light", [&](){ BH1750.begin(); }, [&](){ return BH1750.readLightLevel(); }, true); BME.begin(); sensors.add(P, device::out, 0x76, "out_pressure", [&](){ return BME.pres(BME280::PresUnit_torr); }, true); sensors.add(H, device::out, 0x76, "out_humidity", [&](){return BME.hum(); }, true); sensors.add(T, device::out, 0x76, "out_temperature", [&](){ return BME.temp(BME280::TempUnit_Celsius); }, true); sensors.add(F1_0, device::out, 0x01, "battery1", [&](){ return getSensorData1(); }, true); sensors.add(F2_0, device::out, 0x02, "battery2", [&](){ return f2[0]; }, true); /* пример еще нескольких программных сенсоров */ sensors.add(new knob_t(-100, 0, "1", "RSSI", "dbm"), device::in, "rssi",[&](){ return wifi.isConnected() ? WiFi.RSSI() : 0; }); sensors.add(new knob_t(0, 5, ".01", "Питание", "V"), device::in, "vcc", [&](){ return ESP.getVcc() * 0.001; }); sensors.add(new knob_t(0, 81920, "1", "RAM", "Byte"), device::in, "ram", [&](){ return 81920 - ESP.getFreeHeap(); }); } //-------------------- чтение с первого slave -------------------- void getSensorData1() { //float value=0; float f1[8]={1,1,1,1,1,1,1,1}; // Wire.begin(4, 5); Wire.requestFrom(1, 32); // Wire.requestFrom(1, 32); запрос со slave адреса #1 32-х байт while (Wire.available()) { for (x=0;x<32; x++) { data1[x] = Wire.read(); } byte x=0; for (byte y=0; y<8; y++ ) { b1[0] = data1[x]; x++; b1[1] = data1[x]; x++; b1[2] = data1[x]; x++; b1[3] = data1[x]; x++; f1[y] = *(float*)b1; } delay(100); } return f1[]; } //-------------------------------------------------------
-
10 часов назад, Kitsum сказал:А имеющиеся файлы используйте как подсказки для реализации задуманного
Благодарю за ответ! Теперь понятно, что не надо трогать. Я еще сам не делал скетчи, состоящие из нескольких файлов. По I2C из ProMini я научился передавать массив из 8 floatов в ESP, разбивая и собирая их побайтно на основе Ваших подсказок. Более крупные массивы пытаться передавать, наверное, не буду, мне и этого достаточно будет.
на ProMini это выглядит так (Serial.print удалил, чтобы не загромождало):
Скрытый текст#include "Wire.h" #include "SPI.h" // библиотека для протокола SPI #include "nRF24L01.h" // библиотека для nRF24L01+ #include "RF24.h" // библиотека для радио модуля const uint64_t pipe = 0xF0F1F2F3F4LL; // индитификатор передачи, "труба" RF24 radio(9, 10); // порты CE, CSN (MEGA 49,53; ProMini 9,10 ) byte datab[32]; float dataf[8]; byte b[4]; void setup() { Wire.begin(1); //подключиться к шине i2c с адресом #1 Wire.onRequest(requestEvent); // register event radio.begin(); // включаем радио модуль radio.setAutoAck(0); delay(100); radio.setChannel(100); // устанавливаем канал (0-127) dec100 = hex64 radio.setDataRate(RF24_250KBPS); // скорость передачи данных : RF24_250KBPS, RF24_1MBPS или RF24_2MBPS чем меньше скорость, тем выше чувствительность приемника radio.setPALevel(RF24_PA_HIGH); //мощность передатчика, RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBM,RF24_PA_MAX= 0dBm radio.openReadingPipe(1, pipe); // открываем первую трубу radio.startListening(); // начинаем слушать трубу delay(1000); } void requestEvent() { Wire.write(datab, sizeof(datab)); } void loop() { if (radio.available()) // проверяем буфер обмена NRF24 { radio.read(&dataf, sizeof(dataf)); } // читаем данные, указываем сколько байт читать byte x=0; byte y; for (y=0; y<8; y++) { *(float*)b = dataf[y]; datab[x]=b[0]; x=x+1; datab[x]=b[1]; x=x+1; datab[x]=b[2]; x=x+1; datab[x]=b[3]; x++; } }
на ESP это выглядит так (Serial.print то же удалил):
Скрытый текст// драйвера ESP8266/32 версии 2.4.2 #include <Wire.h> #define SDA_PIN D2 #define SCL_PIN D1 const int16_t I2C_MASTER = 0x42; byte data1[32]; byte b1[4]; float f1[8]; byte x; void setup() { Wire.begin(SDA_PIN, SCL_PIN); // join i2c bus (address optional for master) delay(500); } void loop() { //-------------------- чтение с первого slave -------------------- Wire.requestFrom(1, 32); // Wire.requestFrom(1, 32); запрос со slave адреса #1 32-х байт while (Wire.available()) { // slave may send less than requested for (x=0;x<32; x++) { data1[x] = Wire.read(); } byte x=0; for (byte y=0; y<8; y++ ) { b1[0] = data1[x]; x++; b1[1] = data1[x]; x++; b1[2] = data1[x]; x++; b1[3] = data1[x]; x++; f1[y] = *(float*)b1; } delay(500); } }
Итого получилось, что уличная ProMini получает данные с датчиков, через NRF24 передает массив из 8 чисел на домашнюю ProMini , а та, как slave, отдаёт этот массив на ESP по I2C. Попробовал на одну master ESP повесить одновременно три slave ProMini (в примерах, соответственно, оставил работу только с одним slave ). Вся эта связка работает без сбоев. Осталось подружить с Вашим проектом.
Кстати, уличные датчики на ProMini (с NRF24 и SHT31) получаются весьма непрожорливыми - в режиме сна потребляют от двух батареек АА около 5мкА. И работают они стабильно до напряжения примерно в 2,1В. Так что батареек должно на долго хватить, если передвать данные раз в неколько минут.
Еще раз благодарю за помощь!
- 1
- 1
-
26.02.2019 в 09:29, Kitsum сказал:Функция сбора данных
Если у меня данные с ProMini передаются на ESP массивом, может проще из памяти ESP брать весь массив, чем считывать отдельно каждую ячейку по i2c?
Метеостанция на ESP8266 от it4it.club
в Espressif Systems
Опубликовано: · Жалоба на ответ
спасибо, попробую