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

Devilisimo

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

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

  • Посещение

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

    2

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


  1. @Kitsum  Снова прошу совета у более опытного Автора. D5 и D3 кнопки, при подтяжке программно кнопки не работают, у них есть некое сопротивление. Если идти по классическому варианту - подтянуть сопротивлением 10кОм на 3,3В, то какое-то время работает, но загрузка через USB не работает "error: espcomm_upload_mem failed".  

    Подскажите как сделать правильно.

    Мой код для понимания. 

    Скрытый текст
    
    глобальные 
    boolean sw_open = false;
    boolean sw_close = true;
    boolean sw_st = true;
    
    gpio.h
      
    #define but_open 14                 //D5 g14
    #define but_close 0 
    
    bool gpio_enable = LOW; // HIGH LOW
    bool flag1 = false;
    
    /*   Опрос кнопок :     GPIO: PIN_BUTTON1- конпка 1 открытие; PIN_BUTTON2- кнопка 2 закрытие  */
    void sw_button(){
      #if button_1
        //pinMode(but_open, INPUT);
        pinMode(but_open, INPUT_PULLUP);
      #endif
      #if button_2
        //pinMode(but_close, INPUT);
        pinMode(but_close, INPUT_PULLUP);
      #endif
        
      /* Добавление задачи в планировщик */
        cron.add(cron::time_1s, [&](){
    
               if ((digitalRead(but_open) == gpio_enable) and (flag1 == false)){
                 sw_open = true;
                 flag1 = true;
                 //if (mqttAPI.connected()) mqttPublish("status", "buttom opened is active");
                 }
               if ((digitalRead(but_close) == gpio_enable) and (flag1 == true)){
                 sw_open = false;
                 flag1 = false;
                 //if (mqttAPI.connected()) mqttPublish("status", "buttom closed is active");
                 } 
            });
    }

     

     


  2. @Kitsum Вопрос у меня совсем не к оформлению, меня все устраивает))  Вопрос  почему только данные освещенности отображаются на графике, мне нужны хотя бы стандартные - давление, влажность и температура. Может проблема в именование датчиков? Как их правильно назвать, что данные поттягивались?


  3. 12 минут назад, Kitsum сказал:

    @Devilisimo доброе время суток. Рад, что у все получилось, но не затруднит ли Вас описать точное количество и типы датчиков на i2c шине в те моменты, когда вылетала ошибка? Не совсем ясно, сколько датчиков BME использовалось по факту до того момента, когда была добавлена конфигурация "для двух датчиков". На Nano проверяли путем подключения одного датчика и запуска одного из стандартных примеров?

    В проекте было активировано по сути два датчика - CCS811 и BME. Пробовал разное количество и комбинации. Конфигурация как таковая и до этого была, просто не были прописаны настройки .

    Settings

    Про Nano  Вы совершенно правы. 

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


  4. Добрый день.

    Очень долго мучался с данной проблемой, прям спать не мог. Почему-то решение пришло неожиданно, после проверки датчиков на nano. Добавил конфигурацию датчиков и все снова заработало, не знаю с чем бы это могло быть связано.  До этого почему-то работало в упрощенном режиме без проблем.

    BME280I2C::Settings
    settings_out(
      BME280::OSR_X1,
      BME280::OSR_X1,
      BME280::OSR_X1,
      BME280::Mode_Forced,
      BME280::StandbyTime_1000ms,
      BME280::Filter_Off,
      BME280::SpiEnable_False,
      BME280I2C::I2CAddr_0x76
    ),
    settings_in(
      BME280::OSR_X1,
      BME280::OSR_X1,
      BME280::OSR_X1,
      BME280::Mode_Forced,
      BME280::StandbyTime_1000ms,
      BME280::Filter_Off,
      BME280::SpiEnable_False,
      BME280I2C::I2CAddr_0x77
    );
    BME280I2C BME_OUT(settings_out), BME_IN(settings_in);

     

    • Like 1

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

    @Devilisimo Порт GPIO-2 уже занят штатным светодиодом ESP (по крайней мере для ESP-12X) и объектом blink, описанным в файле tools.h, который и управляет этим светодиодом.

    Спасибо за совет. Пытаюсь вернуться к датчику BME280. Столкнулся с неопреодолимым сопротивлением. Показания на нулях. Датчик CCS811 и дисплей на шине работает исправно. Пробовал разные датчики, в т.ч. BH1750. Пробовал сброс и перепрошивку на старую, рабочую точно, версию. Не понимаю что происходит.

    {"out_light":-2.00,"CCS811_ppm":692.00,"CCS811_ppb":44.00,"BME280_in_temperature":0.00,"BME280_in_humidity":0.00,"BME280_in_pressure":0.00,"rssi":-62.00}

    Уже просто замкнутый круг. 


  6. 10.11.2018 в 11:05, Kitsum сказал:

    Я бы рекомендовал отказаться от датчиков DHT серии в пользу второго датчика BME280, благо их можно держать два на линии, как и некоторые другие датчики температуры и влажности и т.д

    Естественно, что на одном порту мигать светодиодом и общаться с датчиком просто так не получится, но без паники, ничего не решаемого нет.

    Добрый день спасибо за Ваши советы, но я хотел бы уточнить.

    Цитата

    Я использую GPIO-0 и 14 для кнопок, они подтянуты функцией INPUT_PULLUP.

    Цитата

    На GPIO-2 (D4) подключен датчик DHT22 , иногда почему-то показания падают на нули. 

     


  7. 30.01.2017 в 16:43, Kitsum сказал:

    Перед тем как устанавливать метеостанцию на постоянное место жительства, подтянуть GPIO-0 (пин D3 на плате NodeMCU) к питанию 3.3V. Во время данной процедуры, питание на контроллере должно отсутствовать.

    Не совсем понимаю для чего это делать нужно. Я использую GPIO-0 и 14 для кнопок, они подтянуты функцией INPUT_PULLUP. На GPIO-15 почему-то кнопка не заработала, хотя как реле он работает. GPIO-12 и 13 я использую для управления реле, изначальная функция отключена. На GPIO-2 (D4) подключен датчик DHT22 , иногда почему-то показания падают на нули. Все работает почти стабильно, правда пришлось увеличить время опроса датчиков до 10с., но это не так важно.

    Функционал станции: датчики наружные BME280 и BH1750, показания буду отправлять на народный мониторинг; внутри датчик DHT22 и CCS811; по показаниям СО и TVOC при соблюдении внутренней температуры и влажности будет открываться окно для проветривания; с кнопок можно так же можно открыть/закрыть и через команду mqtt, например с телефона.

    Соответственно вопрос, как влияет функция индикации  и что нужно подправить в изначальном коде, что бы не было мучительно больно? 

     


  8. Kitsum  

    Уважаемый автор. Благодарю за развернутые ответы. Прошу подсказать про Вашу функцию "индикация состояния". Если я правильно понимаю, то она задействует пины 0 и 2? Какие еще пины задействованы "неявно"?

    
    /* Индикация состояния контроллера */
    class smartBlink {
      public:
        /* доступные порты */
        typedef enum {
          gpio0 = 0,
          gpio2 = 2, // NodeMCU
        } port_t;

  9. Скрытый текст
    
    // Универсальная подписка на выключатель в формате "switch/'имя нашего esp'/switch'№gpio'"
    void subgpio(byte gpio){
        String strpath;
        strpath += "switch/";
        strpath += conf.param("mqtt_path");
        strpath += "/switch";
        strpath += String(gpio);   
        mqttAPI.subscribe(strpath.c_str());
    }
    //Проверка выключателей по подписке
    boolean callswitch(String topic, String msg, byte gpio){
        boolean sw; 
        if (conf.param("mqtt_path").length())
        {
        //sw = true;  
        String strpath;
        strpath += "switch/";
        strpath += conf.param("mqtt_path");
        strpath += "/switch";
        strpath += String(gpio);   
        //mqttPublish("switch/on",strpath); 
        String sending;
        if ((topic == strpath) and ((msg == "on") or (msg == "ON") or (msg == "On")))
        {     sw = true;   
              sending += "sw_status_";
              sending += String(gpio);
              sending += "_send_GPIO";
              mqttPublish("switch/on",sending);        
          }
        else if ((topic == strpath) and ((msg == "off") or (msg == "OFF"))) 
        {     sw = false; 
              sending += "sw_status_";
              sending += String(gpio);
              sending += "_send_OFF";
              mqttPublish("switch/on",sending);    
          }
         
        }
        return sw;
    }
    
    void callback(char* topic, byte* payload, unsigned int length) {
        String msg;
        for (unsigned int i = 0; i < length; i++) msg += (char)payload[i];
        String top;
        top += topic;
        //Опрашиваем кнопки mqtt управления
        sw_on_0 = callswitch(top, msg, 0);   
        sw_on_12 = callswitch(top, msg, 12);
        sw_on_13 = callswitch(top, msg, 13);       
        sw_on_14 = callswitch(top, msg, 14);
        sw_on_15 = callswitch(top, msg, 15);
                       
        #ifdef console
           console.printf("send=", msgtopic.c_str());
        #endif 
    }
    
    void setupMQTT() {
      if (conf.param("mqtt_server").length()) {
        /* Указываем сервер и порт для подключения. Сервер можно указать через WEB интерфейс, порт измените на свой. */
        mqttServer = conf.param("mqtt_server");
        mqttAPI.setServer(mqttServer.c_str(), mqttPort);
        mqttPath = conf.add("mqtt_path");
        /* Устанавливаем обработчик  mqttPath.c_str() */
        mqttAPI.setCallback(callback);  
      
        /* Задача для восстановления соединения */
        cron.add(cron::time_1m, [&](){
          if (!mqttAPI.connected() and wifi.transferDataPossible()) {
            if(mqttAPI.connect(WiFi.hostname().c_str(),
              (conf.param("mqtt_login").length() ? conf.param("mqtt_login").c_str() : 0),
              (conf.param("mqtt_pass").length() ? conf.param("mqtt_pass").c_str() : 0)
            )) {
              /* Список топиков на которые необходимо оформить подписку */
    
                subgpio(12);
                subgpio(13);
                subgpio(14);
                subgpio(15);
    
                connect_OK = true;
            }
            #ifdef console
              console.printf("Connecting to MQTT server\nanswer: %s\n", mqttCodeStr(mqttAPI.state()).c_str());
            #endif
          }
        }, false);        
      }
      /* end if */
    }

     

    @Kitsum Прошу помощь советом. Данный код для опроса управления GPIO. При планомерной работе все хорошо. Если включить подряд несколько выходов, подать команду. Происходит срабатывание только последнего выхода в списке команд. Может чем-то поможете.

    Скрытый текст
    
    /*
       Управление нагрузкой :
        GPIO  */
    void gpio_sw(){    
         /* gpio=0/12/13/14/15  |  D=3/6/7/5/8 управление | D 3/8 нежелательно использовать */
        //pinMode(0, OUTPUT); digitalWrite(0, !gpio_enable);  //D3
        
          pinMode(12, OUTPUT); digitalWrite(12, !gpio_enable); //D6
          pinMode(13, OUTPUT); digitalWrite(13, !gpio_enable);  //D7
        
        pinMode(14, OUTPUT); digitalWrite(14, !gpio_enable); //D5
        pinMode(15, OUTPUT); digitalWrite(15, !gpio_enable); //D8
        /* Добавление задачи в планировщик */
        cron.add(cron::time_5s, [&](){
          if (connect_OK == true)
          { 
            //gpio 0 D3 нежелательно
            if (sw_on_0 == true and digitalRead(0) == !gpio_enable) 
            { digitalWrite(0, gpio_enable); mqttPublish("switch/on","gpio_0_is_ON"); }         
            else if (sw_on_0 == false and digitalRead(0) == gpio_enable) digitalWrite(0, !gpio_enable);
            //gpio 12 D6 нельзя использовать есть подключен MH-Z19
            if (sw_on_12 == true and digitalRead(12) == !gpio_enable) 
            { digitalWrite(12, gpio_enable); mqttPublish("switch/on","gpio_12_is_ON"); }         
            else if (sw_on_12 == false and digitalRead(12) == gpio_enable) digitalWrite(12, !gpio_enable);
            //gpio 13 D7 нельзя использовать есть подключен MH-Z19
            if (sw_on_13 == true and digitalRead(13) == !gpio_enable) 
            { digitalWrite(13, gpio_enable); mqttPublish("switch/on","gpio_13_is_ON"); }         
            else if (sw_on_13 == false and digitalRead(13) == gpio_enable) digitalWrite(13, !gpio_enable);
            //gpio 14 D5
            if (sw_on_14 == true and digitalRead(14) == !gpio_enable) 
            { digitalWrite(14, gpio_enable); mqttPublish("switch/on","gpio_14_is_ON"); }         
            else if (sw_on_14 == false and digitalRead(14) == gpio_enable) digitalWrite(14, !gpio_enable);
            //gpio 15 D8 нежелательно
            if (sw_on_15 == true and digitalRead(15) == !gpio_enable) 
            { digitalWrite(15, gpio_enable); mqttPublish("switch/on","gpio_15_is_ON"); }         
            else if (sw_on_15 == false and digitalRead(15) == gpio_enable) digitalWrite(15, !gpio_enable);
    
          }
        });
    }

     

     


  10. 17 часов назад, Devilisimo сказал:

    Добрый день. Заказал на али плату Wavgat D1 mini, так понимаю это аналог Wemos D1 mini?

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

    Kitsum  подскажите пожалуйста. Прошил модуль nodemcu_integer_0.9.5_20150318 через nodemcu firmware programmer.

    Скетч заливается успешно и даже как-то работает. Но залить файлы в память не удается, ошибка SPIFFS Create Failed! 

    В чем может быть причина? Прошивки AT20SDK93 и подобные не работают, сыпятся ошибки.


  11. 01.03.2018 в 10:49, pasha413 сказал:

    Здравствуйте. Благодарю за проделанную работу!

    Возник вопрос, загрузил проект в wemos d1mini, что со шрифтами?

     

    Добрый день. Заказал на али плату Wavgat D1 mini, так понимаю это аналог Wemos D1 mini?

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


  12. post125

    библиотека: https://github.com/olikraus/U8g2_Arduino/archive/master.zip

    Kitsum 

    Я разобрался c данной проблемой, ниже выкладываю код, вероятно он не идеален, но работает. Пока сделал функции для управления реле.

    В мыслях есть создание функций для управление нагрузкой через ШИМ на основе мосфетов. Какие модули можете посоветовать?

    https://ru.aliexpress.com/item/Milight-LS4-0-1-10/32852443849.html?spm=a2g0s.13010208.99999999.259.101e3c00l1IpCP

    https://ru.aliexpress.com/item/Mosfet-MOS/32878055897.html?spm=a2g0s.13010208.99999999.271.101e3c00l1IpCP

    https://ru.aliexpress.com/item/High-Current-MOSFET-Switch-Module-DC-Fan-Motor-LED-Strip-Driver-Steples/32661148624.html?spm=a2g0s.13010208.99999999.265.101e3c00l1IpCP

    // Универсальная подписка на выключатель в формате "switch/'имя нашего esp'/switch'№gpio'"
    void subgpio(byte gpio){
        String strpath;
        strpath += "switch/";
        strpath += conf.param("mqtt_path");
        strpath += "/switch";
        strpath += String(gpio);   
        mqttAPI.subscribe(strpath.c_str());
    }
    //Проверка выключателей по подписке
    boolean callswitch(String topic, String msg, byte gpio){
        boolean sw; 
        if (conf.param("mqtt_path").length())
        {
        String strpath;
        strpath += "switch/";
        strpath += conf.param("mqtt_path");
        strpath += "/switch";
        strpath += String(gpio);   
        mqttPublish("switch/on",strpath); 
        String sending;
        if ((topic == strpath) and ((msg == "on") or (msg == "ON") or (msg == "On")))
        {     sw = true;   
              sending += "sw_status_";
              sending += String(gpio);
              sending += "_send_GPIO";
              mqttPublish("switch/on",sending);        
          }
        else if ((topic == strpath) and ((msg == "off") or (msg == "OFF")) and sw == true) sw = false; 
        }
        return sw;
    }

     


  13. ESP8266_WS_V2.0_iT4IT.CLUB.7z

    Если кому-то интересно выкладываю свою версию, она пока сырая, но работает.

    Начал строить свой "умный" дом, броккер установил на малинку, рулим всем через Node-red.

    Очень удобно. Пока допиливаю управление gpio через mqtt.

    Хотел спросить у автора - так понимаю реализована функция, что если нет вай-фая, то переходит в режим точки доступа. Соответственно все данные по старому подключению стираются? Если дома отключился свет или еще что-то. Если мы хотим только через одно подключение делать все, то надо жестко его будет прописать?


  14. Все супер, заработало.

    Еще нужна небольшая подсказка. Хочу сделать универсальную подписку:

                switch2 = "switch/" + conf.param("mqtt_path") + "sw2";
                mqttAPI.subscribe(switch2);

    Ругается: no matching function for call to 'PubSubClient::subscribe(String&)'

    Какого типа должна быть переменная?


  15. Сделал по Вашем рекомендациям.

    void callback(char* topic, byte* payload, unsigned int length) {
        String msg = "M=";
        for (unsigned int i = 0; i < length; i++) msg += (char)payload[i];
    
        char measurementa [12];
        msg.toCharArray(measurementa, 12);
        u8g2.setFont(u8g2_font_inb19_mf);
        u8g2.drawStr((128 - u8g2.getStrWidth(measurementa))/2, u8g2.getAscent() - u8g2.getDescent(), measurementa);
        u8g2.sendBuffer();
                       
         #ifdef console
          console.println(F("services: callback data from MQTT server"));
        #endif 
    }

    Пока сделал тупо для вывода на экран. Ничего не получилось, хотя данные на броккер отправляются.

              /* Список топиков на которые необходимо оформить подписку */
              mqttAPI.subscribe("Odincovo/TVOC");
              mqttAPI.subscribe("Odincovo/BME280_out_temp");

    Еще вопрос как будут разделены данные при подписке на несколько топиков.

              /* Список топиков на которые необходимо оформить подписку */
              mqttAPI.subscribe("weather_station/lcd/topic_name");

    Почему Вы указываете название топика с двумя "/", т.е. может я как-то не так указываю адрес, хотя не телефоне все отображается?


  16. 13.10.2018 в 14:09, Kitsum сказал:

    PS: Забыл упомянуть. Я бы советовал Вам не выводить на дисплей данные сразу после их поступления. Лучше их накапливать. Далее в планировщик задач добавить функция вызываемую, например, каждую минуту и проверяющую отличаются ли поступившие данные от тех, что уже выведены на дисплей. Если да, то выводить новые данные. Таким образом Вы будите экономит процессорное время и избавите контроллер от лишних задач по выводу одинаковых данных на дисплей.

    Добрый день. Все же не до конца понимаю.  client.subscribe - функция по чтению или подписке на данные. Как сделать универсально для запроса данных.

    Сделал по Вашему научению так:

    void callback(char* topic, byte* payload, unsigned int length) {
         #ifdef console
          console.println(F("services: callback data from MQTT server"));
        #endif 
    }
    void readDataFromMQTT() {
        // баг при прямой передаче значения (c_str) из конфига в setServer (не забыть поправить!)
        String server = conf.param("mqtt_server");
        mqttAPI.setServer(server.c_str(), 14728); //1883
        mqttAPI.connect(WiFi.hostname().c_str(),
          (conf.param("mqtt_login").length() ? conf.param("mqtt_login").c_str() : 0),
          (conf.param("mqtt_pass").length() ? conf.param("mqtt_pass").c_str() : 0)
        );  
        mqttAPI.setCallback(callback);
        if (!mqttAPI.connected() and wifi.transferDataPossible()) {
            if(mqttAPI.connect(WiFi.hostname().c_str())) {
                mqttAPI.subscribe("Odincovo/TVOC");
            }
        }
    }
      cron.add(cron::time_5m, sendDataToMQTT);       // Отправка данных MQTT брокеру
      cron.add(cron::time_5m, readDataFromMQTT);       // Получение данных MQTT брокеру

    Нужно ли каждый раз передавать настройки сервера и сети?

    Можно ли сделать функцию числовую 

    float readDataFromMQTT(string topic)

    Что чтение будет это понятно, не могу понять как вытащить данные и передать дальше?


  17. Добрый день. Появились еще глупые вопросы.

    Решил подключить к станции дисплей SSD1306 128x64 I2C. Позаимствовал часть кода создал функцию.

    void draw() {
            u8g2.clearBuffer();
            // test
            const char pi[] {"HI pipi"};
              u8g2.setFont(u8g2_font_6x12_mf);
              x = (128 - u8g2.getStrWidth(pi)) / 2;
              y = y + 2 + u8g2.getAscent() - u8g2.getDescent();
              u8g2.drawStr(x, y, pi);
            // Cycle other meauserments
            String measurement {"..."};
            const char degree {176};
    
            // Switch every 3 seconds
            switch((millis() / 3000) % 3) {
            case 0:
                    { measurement = "T: " + String(sensors.get("out_temperature")) + degree + "C"; }
                    break;
            case 1:
                    { measurement = "H: " + String(sensors.get("out_humidity")) + "%"; }
                    break;
            default:
                    { measurement =  "P: " + String( sensors.get("out_pressure")) + " mmHg"; }
            }
    
            char measurementa [12];
            measurement.toCharArray(measurementa, 12);
    
            u8g2.setFont(u8g2_font_9x18_mf);
            x = (128 - u8g2.getStrWidth(measurementa))/2;
            y = 64 + u8g2.getDescent();
            u8g2.drawStr(x, y, measurementa);
            u8g2.sendBuffer();
    }

    добавил

     // Init display
      u8g2.begin();
    
     /* Добавление в планировщик заданий отрисовкe данных */
      cron.add(cron::time_1m, draw);       // Вывод на экран
    // GPIO Defines
    #define I2C_SDA 5 // D1
    #define I2C_SCL 4 // D2
    // Use U8g2 for i2c OLED Lib
    #include <SPI.h>
    #include <U8g2lib.h>
    U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, I2C_SCL, I2C_SDA, U8X8_PIN_NONE);

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


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

    @Devilisimo К сожалению, Вы не предоставили схему подключения датчика или подробное фото. Мне кажется, что проблема может скрываться как раз в подключении. Возможно не подключен порт 7 он же nWAKE (на платах часто отмечен как WAK). В официальной документации к датчику ccs811 на четвертой странице указано, что порт nWAKE должен быть подтянут к низкому логическому уровню до начала передачи данных по I2C шине. Я не стал занимать порт микроконтроллера для этих целей т.к у меня не автономное устройство, а просто кинул перемычку с nWAKE к соседнему GND.

    Да, так все работает.

    Хотел уточнить по настройке     mqtt

    // баг при прямой передаче значения (c_str) из конфига в setServer (не забыть поправить!)
    String server = conf.param("mqtt_server");
    mqttAPI.setServer(server.c_str(), 1883);
    mqttAPI.connect(WiFi.hostname().c_str(),
      (conf.param("mqtt_login").length() ? conf.param("mqtt_login").c_str() : 0),
      (conf.param("mqtt_pass").length() ? conf.param("mqtt_pass").c_str() : 0)
    );

    Решил воспользоваться сервером https://www.cloudmqtt.com/

    Хотел уточнить что нужно исправить и где указать порт, так понимаю в программе порт  1883?


  19. Добрый день. 

    Хотел спросить у автора. У Вас описана реализация датчика ccs811. Начал с ним работать и выяснил неприятный момент, даже два. Сначала он вообще не стал работать и утащил за собой bme680, при этом bme280 исправно давал данные. Начал копать и нашел тонкость - нужно добавить код: 

    #if SENSOR_CCS811
      #include <ccs811.h>
      //CCS811 ccs811;   - так не работает
      CCS811 ccs811(D3); // nWAKE to D3
    #endif

    Сначала я обрадовался, т.к. все заработало. Но потом показания пропадают примерно через минуту, так повторяется каждый раз при перезагрузке.

    Может Вы уже столкнулись и решили проблемы работы с данным датчиком? Чтение данных взято из Вашего примера:

    /* датчики CO2 CCS811 */
    #if SENSOR_CCS811
      sensors.add(C, device::in, 0x5A, "CCS811_ppm", [&](){
        ccs811.begin();
        ccs811.start(CCS811_MODE_1SEC);
      }, [&](){ 
        uint16_t eco2, etvoc, errstat, raw;
        ccs811.read(&eco2, &etvoc, &errstat, &raw); 
        return eco2; 
      }, true);
    #endif

    В инструкции написано:

    Connect the WAKE pin to ground.

    Так работает.

    image.png


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

    то вариант Вам не подойдет и необходимо придумать иной способ визуализации. Или модифицировать имеющийся переключатель с добавлением нового пункта и реализовать это все в виде циклического перебора всего списка.

    Еще раз благодарю за развернутый ответ.

    В связи с экспериментами с датчиками качества воздуха, в частности сейчас пробую BME680, встал вопрос как сделать строку с меняющимся значением не числовым.

    Например:

    knob_t *GAS = new knob_t( 0, 300, ".1", "Gas",   CalculateIAQ(bme680.gas_resistance / 1000.0));

    Компилятор ругается: 'CalculateIAQ' was not declared in this scope

    Хотя создал процедуру.

    String CalculateIAQ(float score){
      String IAQ_text = "IAQ ";
      score = (100-score)*5;
      if      (score >= 301)                  IAQ_text += "Hazardous";
      else if (score >= 201 && score <= 300 ) IAQ_text += "Very Unhealthy";
      else if (score >= 176 && score <= 200 ) IAQ_text += "Unhealthy";
      else if (score >= 151 && score <= 175 ) IAQ_text += "Unhealthy for Sensitive Groups";
      else if (score >=  51 && score <= 150 ) IAQ_text += "Moderate";
      else if (score >=  00 && score <=  50 ) IAQ_text += "Good";
      return IAQ_text;
    }

    Порекомендуйте красивое решение.

     


  21. Прошу подсказать автора о настройках страниц.

    Хотелось бы сделать несколько вкладок для разных комнат. Сейчас есть переключение наружные/внутренние датчики.

    В каком месте это настраивается?

×
×
  • Создать...