Перейти к публикации
iT4iT.CLUB

post125

Пользователи
  • Публикации

    99
  • Зарегистрирован

  • Посещение

  • Дней в лидерах

    9

Сообщения, опубликованные пользователем post125


  1. 15.04.2019 в 10:55, Kitsum сказал:

    но с разовыми пропажами данных все сложнее

    Добрый день!

    Снизил частоту иницилизации шины до 1раза в час,  на одной ESPке пропуски отсутствуют пока, на другой был однократный пропуск только на одном датчике (болело два датчика). Видимо, ProMini не любят инициализацию шины i2c.

    Уперся в нехватку оперативной памяти. Можно добавить еще 19 датчиков, с 20-го ESP перестаёт строить суточный график из стандартных четырёх датчиков - ошибка "Во время выполнения запроса произошла ошибка. Код ответа:200 (ОК)"; графики отдельно по каждому датчику пока еще строит.

    Проект на ESP32 на горизонте не виднеется?

     


  2. 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 минут)

    Скрытый текст

    10minut.thumb.jpg.5aa1f3b11fa96fb052e7b4803e4fefed.jpg

    ошибка длительностью 20мин (проверка шины и инициализация датчиков на 20 минут, сбора данных с датчиков 1 минута)
    Скрытый текст

    error20min.thumb.jpg.214f555bf544cf09f6f9b096dbdc2636.jpg

     


  3. 5 часов назад, Kitsum сказал:

    Проверьте повторно этот код, возможно, как раз в конце суток, Вы пытаетесь писать за приделы массива, что приводит к краху.

    Добрый день! Ничего не делал, перестали перезагружаться. Видимо, код адаптировался. Понаблюдаю еще.


  4. Добрый день! Благодарю за отзывчивость! Я Вас уже, наверное, достал своими вопросами. Програмный сенсор памяти я не убирал и на одной ESP добавил график на него. Сколько не смострел, значения не выходят за диапазон 49к-52к.

    Скрытый текст

    878405451_8.thumb.jpg.3b68a1e777df35f9455df52c75f0b8e7.jpg

    там где ровно - примерно 51100-51200, где пики - примерно 51700.

    когда происходит перезагрузка непонятно, но где-то к концу суток построения графика. Ранее пытался поднять частоту сбора данных на графики, как-то не получилось. Вроде бы вернул всё обратно. Попробую перепроверить файл index.htm, может там что-то накосячил. Раньше такого, кажется , не  было

    Скрытый текст

    1911226126_-12.thumb.jpg.e32e2682c48a386bcef986a572a0265f.jpg 1951972843_-11.jpg.2a7b94bc3bb4472c8efb98c8cea60937.jpg

    16 часов назад, Kitsum сказал:

    рекомендую использовать 2.4.2.

    это я помню, использую 2,4,2


  5. 4 часа назад, Kitsum сказал:

    Тут уже кому, что больше нравится

    Благодарю за ответ и помощь! У меня что-то обе ESPки перезагружаются примерно 1 раз в сутки, поэтому корректного маштабирования графика мне не видать как своих ушей. Видимо, надо думать куда аккумулировать данные и оттуда строить гафики (что-то своё, не народномониторное). Нет ли какой-нибудь ссылки как построить простенький сервер для этих целей.

    В следующей версии не планируете получать данные на ESP с удаленных датчиков через NRF подключенной к slave ардуине по i2c?


  6. 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);
    }

     

    Скрытый текст

    1744327075_7.thumb.jpg.2239460539f2507674510e5941e5e631.jpg

    Супер! Работает! Спасибо!

     

    1 час назад, Kitsum сказал:

    Уверяю Вас, что все графики масштабируются одинаково

    Да, после отправки сообщения я понял, что в процентном отношении колебания давления значительно меньше, чем остальных параметров, посему оно и выглядит прямой. А нельзя ли при запуске ESP первым значением с датчика заполнить все ячейки, а потом замещать их новыми данными? Тогда сразу графики будут презентабельными


  7. 20.06.2018 в 20:24, Kitsum сказал:

    График масштабируется автоматически и после суток работы приделы значений (в данном случае давления) будут скорректированы.

    Добрый день! Подскажите, пожалуйста, возможно ли масштабировать график давления сразу по получении данных, как  это происходит с другими графиками? Кроме как установить принудительно min и max пределы оси Y? Например,  присваивать минимальному и максимальному значениям первое показание с датчика , а потом последующии данные сравнивать и, при необходимости, заменять ими минимальное и максимальное значения? А то как-то давление совсем грустно выглядит.

    Скрытый текст

    990034505_6.thumb.jpg.e1bbf42760eab1defb1855337cf95e24.jpg

     


  8. 10 часов назад, Kitsum сказал:

    Медианный фильтр использует float для хранения значений, на практике он нужен только чтобы сгладит пиковые выбросы, спровоцированные кратковременными внешними изменениями в среде в которой находятся сенсоры.

    отключение медианного фильтра дало только более плавные графики (в моей конфигурации);

    Взял актуальную прошивку, заменил только считывание с датчиков температуры и влажности на арифметические прогрессии от -1,9 и от +1,9 с шагом +0,1 и -0,1 соответственно. Показания от -1 до +1 округляет до нуля как с фильтром, так и без фильтра. На круглых диаграммах данные в этом диапазоне отображаются корректно.

    с медианным фильтром.jpg

    без медианного фильтра.jpg

    Без имени-1.jpg


  9. 1 час назад, Kitsum сказал:

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

    в логе эти данные  нулевые (те которые в диапазоне от -1 до +1)

    контроль околонулевых значений.pdf


  10. 08.10.2018 в 12:04, Kitsum сказал:

    Конечно есть нюансы, но они будут всегда

    Добрый день! Сегодня ночью были удачные сочетания температури и влажности (иначе бы не заметил). Проанализировав графики ESP и народного монитора пришел к выводу, что ESP все данные от -1 до +1 округляет ровно к нулю. Подскажите, пожалуйста, где это отключить в программе?

    Еще один вопрос№2, можно ли в графиках ESP смещать на графике оси У так, как примерно на народном монитере, чтобы было видно когда температура приближается к точке росы?

    И еще один вопрос№3, в форуме не нашел, как можно изменить частоту передачи данных на narodmon? возможно, более редкая отправка данных решит проблему с эпизодичеккими отправками нулевой температуры на графике narodmon? не факт, но попробовать надо.

    Благодарю за ответ

    ESP 15-4-19.jpg

    narodmon 15-4-19.jpg


  11. 08.10.2018 в 12:04, Kitsum сказал:

    Конечно есть нюансы, но они будут всегда.

    Добрый день! Подскажите, пожалуйста, для чего в Data два файла index - index.htm и index.htm.gz ? Как я понял , приоритет имеют сжатые файлы, но их неудобно редактировать. Можно ли удалить сжатый файл и пользоваться только index.htm? Благодарю за ответ.


  12. Добрый день!

    Как отключить медианный фильтр и фильтр Кальмана? Толи они, толи еще что-то не дает строить график температуры от 0 до 1 градС. На диаграмме температура отражается корректно, на графике стабильно "0".

    Без имени-1.jpg

    Без имени-3.jpg

    Без имени-2.jpg


  13. 3 часа назад, Kitsum сказал:

    На всякий случай скину ссылки на сам плагин Knob

    Благодарю за ответ, посмотрю, но думаю, это на самом деле совсем не критично. Надо двигаться дальше.

    Вот на народном мониторе проявились проблемка - сейчас через ProMini c NRF24 принимаются три параметра температура, влажность и напряжение батареи; В графиках батареи и влажности есть пропуски данных (в виде нулевых значений), причём в разное время, а в графике температуры таких пропусков нет. Странно это, ведь данные с ProMini считываются сразу всем массивом в память ESP, а потом из памяти раздаются. Может где-то ESPка не успевает их считать. Попробую снизить скорость обмена по i2c, если позволит библиотека. Хотя думаю, что проблема где-то в другом месте. Первым в массиве идёт батарея, тогда в других данных должна была бы возникнуть подобная ошибка в такое же время, как в батарее, но этого не наблюдается.

    По датчикам ESP на шине i2c пропусков нет.

    На локальных графиках пропусков то же нет.

    Без названия 6.jpg

    Без названия 7.jpg

    Без названия 5.jpg


  14. 08.10.2018 в 12:04, Kitsum сказал:

    Я не вижу причин не позволяющих реализовать то, что Вы задумали. Конечно есть нюансы, но они будут всегда.

    С вашей помощью заработало! Ура! Маленький вопрос - можно ли отображать значение напряжения до 3-го знака после запятой?  изменение .01 на .001 результата не даёт, хотя данные со slave имеют и третью цифру после запятой

    knob_t *F2_0 = new knob_t(0, 125, ".001", "батт_улица", "В");

    meteo.jpg


  15. 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

    • Like 1

  16. 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,

    или как-то иначе?


  17. так, почему то, совсем не хочет ничего читать

      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;
    }

     


  18. 45 минут назад, Kitsum сказал:

    Остальные ошибки по невнимательности или спешке, думаю нет смысла на них указывать.

    Благодарю за ответ! На ошибки крайне желательно указывать, если не сложно. Я не специалист в программировании, посему принимаю всё с глубокой благодарностью.


  19. 23.04.2017 в 17:02, EndWar сказал:

    SI7021

    SHT31 - самые точные датчики из из тех, что я тестировал (ВМЕ280, HDC1080, SI7021, DHT, DS18, AM2320) в диапазоне от -25 до +70 гр.С. Не счтитая SHT35 (но он дороже всех этих) и Si7051(измеряет только температуру)


  20. Добрый день!

    Что-то не получается считать массив  в 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[];
    }
    //-------------------------------------------------------

     

     


  21. 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В. Так что батареек должно на долго хватить, если передвать данные раз в неколько минут.

    Еще раз благодарю за помощь!

    • Like 1
    • Thanks 1
×
×
  • Создать...