Devilisimo
-
Публикации
29 -
Зарегистрирован
-
Посещение
-
Дней в лидерах
2
Сообщения, опубликованные пользователем Devilisimo
-
-
Да, спасибо. Сам понял свою ошибку. Не нужно переименовывать: out_pressure - in_temperature. И тогда будет счастье. Эти имена действительно завязаны с web-страницей.
-
@Kitsum Вопрос у меня совсем не к оформлению, меня все устраивает)) Вопрос почему только данные освещенности отображаются на графике, мне нужны хотя бы стандартные - давление, влажность и температура. Может проблема в именование датчиков? Как их правильно назвать, что данные поттягивались?
-
@Kitsum Соответственно хотел спросить такой вопрос. На суточном графике нет отображения всех параметров. Что на это влияет?
Графики по каждому отдельно параметру отображаются без проблем.
-
12 минут назад, Kitsum сказал:@Devilisimo доброе время суток. Рад, что у все получилось, но не затруднит ли Вас описать точное количество и типы датчиков на i2c шине в те моменты, когда вылетала ошибка? Не совсем ясно, сколько датчиков BME использовалось по факту до того момента, когда была добавлена конфигурация "для двух датчиков". На Nano проверяли путем подключения одного датчика и запуска одного из стандартных примеров?
В проекте было активировано по сути два датчика - CCS811 и BME. Пробовал разное количество и комбинации. Конфигурация как таковая и до этого была, просто не были прописаны настройки .
Settings
Про Nano Вы совершенно правы.
После добавления расширенных настроек все датчики стали исправно работать. В интернете читал про необходимость активации функций датчика, возможно это помогает.
-
Добрый день.
Очень долго мучался с данной проблемой, прям спать не мог. Почему-то решение пришло неожиданно, после проверки датчиков на 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);
- 1
-
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}
Уже просто замкнутый круг.
-
10.11.2018 в 11:05, Kitsum сказал:Я бы рекомендовал отказаться от датчиков DHT серии в пользу второго датчика BME280, благо их можно держать два на линии, как и некоторые другие датчики температуры и влажности и т.д
Естественно, что на одном порту мигать светодиодом и общаться с датчиком просто так не получится, но без паники, ничего не решаемого нет.
Добрый день спасибо за Ваши советы, но я хотел бы уточнить.
ЦитатаЯ использую GPIO-0 и 14 для кнопок, они подтянуты функцией INPUT_PULLUP.
ЦитатаНа GPIO-2 (D4) подключен датчик DHT22 , иногда почему-то показания падают на нули.
-
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, например с телефона.
Соответственно вопрос, как влияет функция индикации и что нужно подправить в изначальном коде, что бы не было мучительно больно?
-
Kitsum
Уважаемый автор. Благодарю за развернутые ответы. Прошу подсказать про Вашу функцию "индикация состояния". Если я правильно понимаю, то она задействует пины 0 и 2? Какие еще пины задействованы "неявно"?
/* Индикация состояния контроллера */ class smartBlink { public: /* доступные порты */ typedef enum { gpio0 = 0, gpio2 = 2, // NodeMCU } port_t;
-
Скрытый текст// Универсальная подписка на выключатель в формате "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); } }); }
-
17 часов назад, Devilisimo сказал:Добрый день. Заказал на али плату Wavgat D1 mini, так понимаю это аналог Wemos D1 mini?
Загрузить ничего на него не получается и файлы в флеш прошить тоже. Может подскажете что-то, раз имели практику работы.
Kitsum подскажите пожалуйста. Прошил модуль nodemcu_integer_0.9.5_20150318 через nodemcu firmware programmer.
Скетч заливается успешно и даже как-то работает. Но залить файлы в память не удается, ошибка SPIFFS Create Failed!
В чем может быть причина? Прошивки AT20SDK93 и подобные не работают, сыпятся ошибки.
-
01.03.2018 в 10:49, pasha413 сказал:Добрый день. Заказал на али плату Wavgat D1 mini, так понимаю это аналог Wemos D1 mini?
Загрузить ничего на него не получается и файлы в флеш прошить тоже. Может подскажете что-то, раз имели практику работы.
-
библиотека: https://github.com/olikraus/U8g2_Arduino/archive/master.zip
Я разобрался c данной проблемой, ниже выкладываю код, вероятно он не идеален, но работает. Пока сделал функции для управления реле.
В мыслях есть создание функций для управление нагрузкой через ШИМ на основе мосфетов. Какие модули можете посоветовать?
// Универсальная подписка на выключатель в формате "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; }
-
Если кому-то интересно выкладываю свою версию, она пока сырая, но работает.
Начал строить свой "умный" дом, броккер установил на малинку, рулим всем через Node-red.
Очень удобно. Пока допиливаю управление gpio через mqtt.
Хотел спросить у автора - так понимаю реализована функция, что если нет вай-фая, то переходит в режим точки доступа. Соответственно все данные по старому подключению стираются? Если дома отключился свет или еще что-то. Если мы хотим только через одно подключение делать все, то надо жестко его будет прописать?
-
Все супер, заработало.
Еще нужна небольшая подсказка. Хочу сделать универсальную подписку:
switch2 = "switch/" + conf.param("mqtt_path") + "sw2"; mqttAPI.subscribe(switch2);
Ругается: no matching function for call to 'PubSubClient::subscribe(String&)'
Какого типа должна быть переменная?
-
Сделал по Вашем рекомендациям.
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");
Почему Вы указываете название топика с двумя "/", т.е. может я как-то не так указываю адрес, хотя не телефоне все отображается?
-
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)
Что чтение будет это понятно, не могу понять как вытащить данные и передать дальше?
-
Прошу помощи по второму вопросу.
Как реализовать функцию чтения данных с сервера MQTT, для дальнейшего вывода на дисплей.
-
Беру свои слова обратно. Работает виноват китайский дисплей - SCL и SDA перепутаны.
- 1
-
Добрый день. Появились еще глупые вопросы.
Решил подключить к станции дисплей 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 часов назад, 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?
-
Добрый день.
Хотел спросить у автора. У Вас описана реализация датчика 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.
Так работает.
-
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; }
Порекомендуйте красивое решение.
-
Прошу подсказать автора о настройках страниц.
Хотелось бы сделать несколько вкладок для разных комнат. Сейчас есть переключение наружные/внутренние датчики.
В каком месте это настраивается?
Метеостанция на ESP8266 от it4it.club
в Espressif Systems
Опубликовано: · Жалоба на ответ
@Kitsum Снова прошу совета у более опытного Автора. D5 и D3 кнопки, при подтяжке программно кнопки не работают, у них есть некое сопротивление. Если идти по классическому варианту - подтянуть сопротивлением 10кОм на 3,3В, то какое-то время работает, но загрузка через USB не работает "error: espcomm_upload_mem failed".
Подскажите как сделать правильно.
Мой код для понимания.