Jump to content
iT4iT.CLUB

Recommended Posts

Доброго времени Суток!

Не могу настроить отправку данных на сервер MQTT. Топики с какими названиями нужно создать на сервере ?  Что писать в настройках топика в веб интерфейсе ? Помогите разобраться.

Share this post


Link to post
Share on other sites

Доброе время суток.

4 часа назад, m-kov сказал:

Не могу настроить отправку данных на сервер MQTT. Топики с какими названиями нужно создать на сервере ?  Что писать в настройках топика в веб интерфейсе ?

Все сделано не совсем явно, т.к делалось для себя, ну да ладно. Давайте разбираться.

В первую очередь нужно рассмотреть форму в web интерфейсе, а точнее раздел под названием "Корневой путь".

image.png

Данное поле связано с параметром конфигурации ESP8266 с идентификатором mqtt_path

 image.png

Теперь идем в модуль services.h и смотрим как формируется путь топика

image.png

Видим, что полный путь состоит из значения параметра mqtt_path и значения переменной topic передаваемой в качестве параметра функции mqttPublish

Теперь смотрим функцию sendDataToMQTT, а точнее ту её часть, где вызывается mqttPublish

image.png

Естественно, что данная функция используется как пример и Вы должны сами переопределить используемые вами сенсоры и все, что с ними связано, в том числе и пути mqtt.

Теперь, если в web интерфейсе мы укажем корневой путь home/wetherStation/outdoors, а в коде будем использовать вызов mqttPublish как показано на скриншоте, то данные будут отправлены по следующим адресам топиков:

  • home/wetherStation/outdoors/light
  • home/wetherStation/outdoors/temperature
  • home/wetherStation/outdoors/humidity
  • home/wetherStation/outdoors/pressure

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

 

Share this post


Link to post
Share on other sites

день добрый

большое спасибо за проект!

 немного допилил под себя, все работает, для расчетов точки росы и как ощущается температура(heatIndex) использовал библиотеку EnvironmentCalculations.h из примера к датчику BME280, у меня установлен только он

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

/* Барометр + влажность + температура */
#if SENSOR_BME280
  #include <EnvironmentCalculations.h>
  EnvironmentCalculations::TempUnit     envTempUnit =  EnvironmentCalculations::TempUnit_Celsius; 
  #include <BME280I2C.h>
  BME280I2C BME;
#else
 sensors.add(new knob_t(-40, 125, ".1", "Ощущается", "°C"), "out_heatIndex",
    [&](){ return EnvironmentCalculations::HeatIndex(sensors.get("out_temperature"), sensors.get("out_humidity"), envTempUnit); }
  );

  sensors.add(new knob_t(-40, 125, ".1", "Точка росы", "°C"), "out_dewPoint",
    [&](){ return EnvironmentCalculations::DewPoint(sensors.get("out_temperature"), sensors.get("out_humidity"), envTempUnit); }
  );

и добавил 0.34 вольта к питанию

sensors.add(new knob_t(0, 5, ".01", "Питание", "V"), device::in, "vcc", [&](){
    return ESP.getVcc() * 0.001 + 0.34;

 

Share this post


Link to post
Share on other sites

и еще такой вопрос, позже хочу добавить датчик освещенности(кстати, какой порекомендуете? как понял их несколько разных) можно ли будет менять фон облаков в зависимости от порогов освещенности, насколько это сложно?

то есть ночь - облака ночью и луна, день - дневной фон

Edited by Neon

Share this post


Link to post
Share on other sites

Доброе время суток.

29.09.2019 в 15:24, Neon сказал:

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

Думаю, что Вы все сделали правильно, по крайней мере в контексте данного проекта. Другой вопрос, на сколько сам проект корректно написан...

29.09.2019 в 15:32, Neon сказал:

и еще такой вопрос, позже хочу добавить датчик освещенности(кстати, какой порекомендуете? как понял их несколько разных) можно ли будет менять фон облаков в зависимости от порогов освещенности, насколько это сложно?

то есть ночь - облака ночью и луна, день - дневной фон

Датчик освещенности берите исходя из потребности. не думаю. что будут сложности с добавлением любого из них. Лично я люблю датчики, имеющие I2C интерфейс, но это мои личные предпочтения.

Что касаемо изменения интерфейса в зависимости от внешних факторов. Сразу отвечу. что это возможно. но Вам придется разобраться с CSS.

На данный момент все стили анимации, о которой Вы говорите описаны в файле cloud.css, он подгружается java скриптом после загрузки страницы. Забегая вперед скажу. что такой механизм загрузки связан с ограниченной производительностью контроллера и тем, что он отдает файлы web интерфейса в один поток. Также в этом файле находятся все изображения облаков и луны в специальном формате base64.

После загрузки этого файла, стили, описанные в нем, добавляются к основному стилю, описанному в файле index.htm. После этой операции стили могут быть применены к объектам HTML.

Анимация цвета фона описывается классом .sky

.sky {
    background: #007fd5;
    -webkit-animation: sky_background 50s ease-out infinite;
    -moz-animation: sky_background 50s ease-out infinite;
    -o-animation: sky_background 50s ease-out infinite;
    -webkit-transform: translate3d(0, 0, 0);
    -moz-transform: translate3d(0, 0, 0);
    -o-transform: translate3d(0, 0, 0);
}

Тут описан начальный цвет фона и все трансформации. Обратите внимание, что некоторые стили в разных движках браузеров описываются по-разному.

В коде видно. что анимацией занимается объект sky_background

@-webkit-keyframes sky_background {
    0% { background: #007fd5; color: #007fd5 }
    50% { background: #000; color: #a3d9ff }
    100% { background: #007fd5; color: #007fd5 }
}
@-moz-keyframes sky_background {
    0% { background: #007fd5; color: #007fd5 }
    50% { background: #000; color: #a3d9ff }
    100% { background: #007fd5; color: #007fd5 }
}

На этом описание смены цвета фона заканчивается.

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

Данные с сенсоров читает java функция, описанная в index.htm

function chenge(fast) {
        if(allowAjaxConnection || fast) {
            $.ajax({
                dataType: "json",
                url:  domain + "api/sensors" + ($(".settings #sl-system").is(":visible") ? "?system=true" : ""),
                type: "GET",
                cache: false,
                timeout: 3000,
                success: function(data) {
                    $.each(data, function(name, value) { if (name !== 'system') animate("." + name, value); });
                    if (data.system) apiSetSystemInfo(data.system, true);
                    //$('.out_temperature').trigger('configure', {"fgColor":"#FF0000"});
                }
            });
        }
        setTimeout(chenge, 5000);
    }

Переменная name содержит имя сенсора, а переменная value значение. Останется только добавить условие проверки имени и связать значение с цветом фона.

Луна описана в CSS классом moon, а в коде включается с помощью строки

$(".moon").show();

Но Вам лучше использовать более плавные анимации.

  • Like 1

Share this post


Link to post
Share on other sites

Доброго времени суток всем, повторил проект прошил и залил файлы на ESP,  помогите советом что предпринять если точка доступа есть, а подключиться не удается ни на компе ни на смартфоне. Демоверсия скетча AP из примеров ведет себя также не объяснимо пишет пароль неверен, смутные подозрения что то связано с шифрованием, но опыта почти нет.... 

Untitled.jpg

Edited by Stefan

Share this post


Link to post
Share on other sites

Здравствуйте! Ваш проект лучший для изучения. Но есть несколько вопросов. mqtt работает только на отправку.  Как лучше реализовать и прием? И не хватило знаний как в index.htm добавить еще одно меню без пароля.

Пока сделал так.

  /* Инициализация GPIO для управления внешней нагрузкой */
  gpio_12(); // Простое превышение температуры (выставляется в WEB интерфейсе)
//  gpio_13(); // Простое превышение влажности (выставляется в WEB интерфейсе)
//  gpio_14();    // Расхождение расчетной абсолютной влажности между показаниями с двух датчиков, например, BME280

  /* Добавление в планировщик заданий по отправке данных на внешнии ресурсы */
  cron.add(cron::time_1m, sendDataToMQTT);       // Отправка данных MQTT брокеру
  cron.add(cron::time_5m, sendDataToThingSpeak); // Отправка данных на сервер "ThingSpeak"
  cron.add(cron::time_5m + cron::minute, sendDataToNarodmon); // Отправка данных на севрер "Народный мониторинг"

  /* Добавление в планировщик заданий по контролю датчиков (холодный старт) */
  sensors.checkLine(); // один раз
//  cron.add(cron::time_12h,  [&](){ sensors.checkLine();  }, true); // Проверка шины и инициализация датчиков при необходимости
  cron.add(cron::time_5s,  [&](){ sensors.dataUpdate(); }, true); // Сбор данных с датчиков
  /* Добавление в планировщик задания (горячий старт) */
  cron.add(cron::time_10m, [&](){ sensors.logUpdate();  }, "httpSensorsLog"); // Обновление журнала (httpSensorsLog - не обязательный уникальный ID для быстрого поиска задания другими программными модулями)
  // получение данных по mqtt
  mqttAPI.setCallback(callback);

}

void loop() {
  /* Обработчики */
  wifi.handleEvents();
  http.handleClient();
  cron.handleEvents();
  if (wifi.transferDataPossible() and conf.param("mqtt_server").length()) {
    mqttAPI.loop();
  }
}

И в services

#ifndef SERVICES_H
#define SERVICES_H

#include <PubSubClient.h>
#include <ESP8266HTTPClient.h>
#include "webserver.h"

WiFiClient wifiClient;
PubSubClient mqttAPI(wifiClient);

String httpCodeStr(int code) {
  switch(code) {
    case -1:  return "CONNECTION REFUSED";
    case -2:  return "SEND HEADER FAILED";
    case -3:  return "SEND PAYLOAD FAILED";
    case -4:  return "NOT CONNECTED";
    case -5:  return "CONNECTION LOST";
    case -6:  return "NO STREAM";
    case -7:  return "NO HTTP SERVER";
    case -8:  return "TOO LESS RAM";
    case -9:  return "ENCODING";
    case -10: return "STREAM WRITE";
    case -11: return "READ TIMEOUT";
     default: return  http.codeTranslate(code);
  }
}

String mqttCodeStr(int code) {
  switch (code) {
    case -4: return "CONNECTION TIMEOUT";
    case -3: return "CONNECTION LOST";
    case -2: return "CONNECT FAILED";
    case -1: return "MQTT DISCONNECTED";
    case  0: return "CONNECTED";
    case  1: return "CONNECT BAD PROTOCOL";
    case  2: return "CONNECT BAD CLIENT ID";
    case  3: return "CONNECT UNAVAILABLE";
    case  4: return "CONNECT BAD CREDENTIALS";
    case  5: return "CONNECT UNAUTHORIZED";
    default: return String(code);
  }
}

bool mqttPublish(String topic, String data) {
  yield();
  if (conf.param("mqtt_path").length()) topic = conf.param("mqtt_path") + "/" + topic;
  return mqttAPI.publish(topic.c_str(), data.c_str(), true);
}
bool mqttPublish(String topic, float data) { return mqttPublish(topic, String(data)); }
bool mqttPublish(String topic, int32_t data) { return mqttPublish(topic, String(data)); }
bool mqttPublish(String topic, uint32_t data) { return mqttPublish(topic, String(data)); }

bool mqttSubscribe(String topic) {
  yield();
  if (conf.param("mqtt_path").length()) topic = conf.param("mqtt_path") + "/" + topic;
  return mqttAPI.subscribe(topic.c_str());
}

void restAPIsend(String host, uint16_t port, String query) {
  HTTPClient restAPI;
  restAPI.setUserAgent("weather station " + WiFi.hostname());
  restAPI.setTimeout(3000);
  restAPI.begin(host, port, query);
  int code = restAPI.GET();
  #ifdef console
    console.printf("answer: %s\n", httpCodeStr(code).c_str());
  #endif
  restAPI.end();
  yield();
}

/* mqtt.it4it.club */
void callback(char* topic, byte* payload, unsigned int length) {
  String Tmsg = "";
  for (int i = 0; i < length; i++) {
    Tmsg = Tmsg+(char)payload[i];
  }
    #ifdef console
      console.print("Message arrived [");
      console.print(topic);
      console.print("/");
      console.print(Tmsg);
      console.println("]");
    #endif
  if (topic = "Meteo/tgaz") {
    conf.param("gpio12", Tmsg); 
    #ifdef console
      console.println(conf.param("gpio12"));
    #endif
  } 
}

/* mqtt.it4it.club */
void reconnect() {
  if (wifi.transferDataPossible() and conf.param("mqtt_server").length()) {
    // баг при прямой передаче значения (c_str) из конфига в setServer (не забыть поправить!)
    String server = conf.param("mqtt_server");
    int port = conf.param("mqtt_port").toInt();
    mqttAPI.setServer(server.c_str(), port);
    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)
    );
    if (mqttAPI.connected()) {
      #ifdef console
        console.println(F("services: send data to MQTT server"));
      #endif
      mqttSubscribe("tgaz");
      mqttPublish("t_need",    conf.param("gpio12"));
      mqttPublish("temperature", sensors.get("out_temperature"));
      mqttPublish("humidity",    sensors.get("out_humidity"));
      mqttPublish("pressure",    sensors.get("out_pressure"));
      mqttPublish("co2",         sensors.get("out_co2"));
    } else {
      #ifdef console
        console.printf("answer: %s\n", mqttCodeStr(mqttAPI.state()).c_str());
      #endif
    }
  }
}

void sendDataToMQTT() {
  if (wifi.transferDataPossible() and conf.param("mqtt_server").length()) {
    if (mqttAPI.connected()) {
      #ifdef console
        console.println(F("services: send data to MQTT server"));
      #endif
      mqttPublish("t_need",    conf.param("gpio12"));
      mqttPublish("temperature", sensors.get("out_temperature"));
      mqttPublish("humidity",    sensors.get("out_humidity"));
      mqttPublish("pressure",    sensors.get("out_pressure"));
      mqttPublish("co2",         sensors.get("out_co2"));
    } else {
      reconnect();
      #ifdef console
      #endif
    }
  }
}

/* https://thingspeak.com/ */
void sendDataToThingSpeak() {
  if (wifi.transferDataPossible() and conf.param("thingspeak_key").length()) {
    #ifdef console
      console.println(F("services: send data to ThingSpeak"));
    #endif

    String query;
    query += "&field1=" + String(sensors.get("out_light"));
    query += "&field2=" + String(sensors.get("out_temperature"));
    query += "&field3=" + String(sensors.get("out_humidity"));
    query += "&field4=" + String(sensors.get("out_pressure"));
    query += "&field5=" + String(sensors.get("out_co2"));

    restAPIsend("api.thingspeak.com", 80, "/update?api_key=" + conf.param("thingspeak_key") + query);
  }
}

/* https://narodmon.ru/ */
void sendDataToNarodmon() {
  if (wifi.transferDataPossible() and conf.param("narodmon_id").length()) {
    #ifdef console
      console.println(F("services: send data to Narodmon"));
    #endif

    String query;
    query += "&L1="  + String(sensors.get("out_light"));
    query += "&T1="  + String(sensors.get("out_temperature"));
    query += "&H1="  + String(sensors.get("out_humidity"));
    query += "&P1="  + String(sensors.get("out_pressure"));
    query += "&CO2=" + String(sensors.get("out_co2"));
//    query += "&H2="  + String(sensors.get("out_absoluteHumidity"));

    restAPIsend("narodmon.ru", 80, "/get?id=" + conf.param("narodmon_id") + query);
  }
}

#endif

 

Share this post


Link to post
Share on other sites

Доброе время суток.

@Stefan Это очень странное поведение. Если есть возможность, то попробуйте подключиться  к контроллеру с "левых" устройств, не в ходящих в Ваше домашнее окружение. Проверьте как работает тестовый скетч для режима STA и подключитесь в качестве клиента к Вашей домашней сети или опишите в программе метеостанции к чему подключаться контроллеру. В основном файле программы есть такие строки:

conf.add("client_ssid");
conf.add("client_pass");
conf.add("client_bmac");

Первые два параметра отвечают за имя домашней WiFi сети и пароль, последний за MAC адрес и требуется если сеть скрыта, в противном случае его заполнять не обязательно.

conf.add("client_ssid", "имя сети");
conf.add("client_pass", "пароль от сети");
conf.add("client_bmac", "MAC можно не указывать");

Также есть вероятность, что Ваши устройства не могут работать в едином стандарте с AP микроконтроллера. Если память не подводит, то контроллер должен использовать 802.11n.

Попробуйте пока так поэкспериментировать.

@IvAn 

09.10.2019 в 12:33, IvAn сказал:

mqtt работает только на отправку.  Как лучше реализовать и прием?

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

  • Проверяйте состояние соединения как со стороны микроконтроллера, так и со стороны MQTT клиента
  • Подключаемся к серверу только при наличии подключения к точке доступа
  • Если восстанавливаем соединение, то не забываем восстановить подписки
  • Публикуем сообщения только если отработал п.1
  • Я думаю, и это только мое личное мнение, что функция "callback" не должна заниматься обработкой команд. Её цель - принять и понять, что нужно сделать, а дальше сообщить об этом основному коду. Вдруг вы будите получать сообщения со скоростью пулеметной очереди...

Не знаю, будет ли Вам полезно, но посмотрите на этот код https://it4it.club/files/file/8-prostoy-dvuhkanalnyy-schetchik-vody-na-esp8266/

09.10.2019 в 12:33, IvAn сказал:

как в index.htm добавить еще одно меню без пароля

Обратите внимание, что в данном проекте, html код бесполезен без jQuery. Именно в последнем кроется логина обработки всех событий, в том числе и появление меню. Я опишу, на что Вам стоит обратить внимание.

В файле index.htm есть такой кусочек разметки, он отвечает за меню

<div class="menu">
	<div id="sensors" class="list1"></div>
	<div id="graph"></div>
	<div id="settings"></div>
</div>

Как мы видим, имеется объект с идентификатором settings, который отображает нам иконку настроек. Этому объекту соответствует небольшой кусочек кода в css. описанный чуть выше и говорящий браузеру сформировать фон объекта в виде изображения.

.menu #settings { background-image: url('data:image/png;base64, ... '); }

Часть кода элемента я скрыл т.к он представляет из себя строку закодированную в base64 формате, а оригинал строки является бинарным файлов. Это сделано, чтобы не хранить изображение отдельно в flash памяти и загрузить его вместе с загрузкой файла index.htm. Это уловка чтобы получить большую производительность в работе web интерфейса данного проекта т.к браузер загружает разные файлы в отдельных потоках, а контроллер не способен отдавать параллельно несколько файлов. Из-за этого мы отдаем все критически нужное в одном потоке. Конечно есть механизмы решающие и эти задачи, но я пришел к ним уже на контроллере esp32.

Теперь, когда у нас есть кнопка и ее оформление, можно вешать на неё события. В нашем случае это событие клика мышью и реализовано через библиотеку jQuery. Ищем следующий код.

$("#settings").click(function() {
	/* ... */
});

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

По сути, самый простой вариант, это отобразить заранее подготовленное меню, но находящееся в скрытом состоянии. Например, опять наше меню настроек. Оно скрыто из-за параметра hidden, но это не единственный способ.

<div class="settings" hidden>
	<!-- ... -->
</div>

Для этого в описанную ране функцию click можно добавить следующий код

$(".settings").show();

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

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

Share this post


Link to post
Share on other sites

@Вадим Спасибо за ссылку. Метеостанция интересна, но меня больше заинтересовал плагин реализующий датчики. Как оказалось, он довольно стар и уже претерпел не мало изменений. Вот интересные ссылки по этой теме:

Вероятнее всего я постараюсь использовать данный плагин на ESP32.

 

Share this post


Link to post
Share on other sites
22.10.2019 в 23:14, Вадим сказал:

http://vozmeteo.com.ua/index.php  Похожий интересный проект. И графики прикольные. Только кода нет.

красиво, но похоже ресурсоемко, у меня в брауезере притормаживает...

 

 

Share this post


Link to post
Share on other sites

Kitsum

здравствуйте, вы похоже недавно корректировали файлы и забыли в файле webserver.h в строке

 String codeTranslate(int code) { return ESP8266WebServer::_responseCodeToString(code); }

подчеркивание перед responseCodeToString(code);

Share this post


Link to post
Share on other sites

@Neon доброе время суток.

Да действительно, Вы правы, файлы были обновлены, но этой ошибки там нет. Все дело в обновлении среды разработки и пакета ESP8266. Теперь можно использовать Arduino IDE v1.8.10 с поддержкой ESP8266 v2.5.2. И как раз в последних версиях пакета ESP8266 были переименованы некоторые функции и responseCodeToString теперь имеет имя без нижнего подчеркивания. Я постарался чтобы проект поддерживал одну из последних версий пакета.

Также я выложил некоторые дополнительные наработки которые накопились у меня во время работы над ответами некоторым пользователям в этой теме. Теперь можно подсмотреть как добавит датчики DS18B20 или самодельный анемометр с импульсным выходом.

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

  • Thanks 1

Share this post


Link to post
Share on other sites

А у esp32 есть какие то функции отсутствующие в esp8266?

 

У меня почему-то исчез вывод показаний RSSI, это произошло после нескольких перепрошивок esp, теперь при прошивке даже разных esp все равно не выводит... поэтому то и скачивал заново прошивку, думал может я что-то изменил и не заметил

Кстати, запустил метеостанцию на esp01 :)

Поставил на нее 4 МБ и датчик BME280

Share this post


Link to post
Share on other sites

@Neon доброе время суток.

11.11.2019 в 06:55, Neon сказал:

А у esp32 есть какие то функции отсутствующие в esp8266?

Да, это более современный контроллер и гораздо более производительный.

11.11.2019 в 06:55, Neon сказал:

У меня почему-то исчез вывод показаний RSSI, это произошло после нескольких перепрошивок esp

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

Вот его код

sensors.add(new knob_t(-100, 0, "1", "RSSI", "dbm"), device::in, "rssi",[&](){ 
  return wifi.isConnected() ? WiFi.RSSI() : 0; 
});
11.11.2019 в 06:55, Neon сказал:

Кстати, запустил метеостанцию на esp01 :)

Поставил на нее 4 МБ и датчик BME280

Хороший опыт, рад, что у Вас все получилось)

11.11.2019 в 06:57, Neon сказал:

Обратил внимание , что в Ардуино IDE при в плате esp можно выбрать 8 и 16 мегабайт

Выбираемые параметры разметки flash памяти в Arduino IDE зависят для конкретных плат, описанных в файле boards.txt для ESP8266 и отмеченных параметром flash_ld. Сами ld файлы располагаются в каталоге по относительному пути \hardware\esp8266\2.5.2\tools\sdk\ld и зависят от версии пакета ESP8266 (в примере 2.5.2) и от того используете Вы или нет Portable версию Arduino IDE. Для данного проекта я рекомендовал использовать контроллер с 4Mb Flash и разбивать её по схеме описанной в файле eagle.flash.4m3m.ld. А тут можно посмотреть их содержимое не копаясь в самой среде на своем компьютере https://github.com/esp8266/Arduino/tree/master/tools/sdk/ld В общем это очень интересная тема, но требует внимательности и не прощает ошибок.

Share this post


Link to post
Share on other sites
11.11.2019 в 06:57, Neon сказал:

Обратил внимание , что в Ардуино IDE при в плате esp можно выбрать 8 и 16 мегабайт

Я впаивал в ESP память и 8 и 16 МБ и соответственно менял конфигурации а Arduini IDE - никакого смысла в этом нет, работает совершенно так же , как и с 4 МБ. И начальная загрузка дольше, особенно с 8 МБ. И на большом количестве датчиков точно также перестает строить тренды.

Edited by post125

Share this post


Link to post
Share on other sites
15 часов назад, Kitsum сказал:

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

Вот его код


sensors.add(new knob_t(-100, 0, "1", "RSSI", "dbm"), device::in, "rssi",[&](){ 
  return wifi.isConnected() ? WiFi.RSSI() : 0; 
});

код вроде на месте, сам кружок RSSI есть , но показывает 0, а шкала круга на максимуме

причем для проверки скачал архив с форума , раскомментировал RSSI и все равно 0, возможно что-то настройками IDE намудрил, буду пробовать проверять

 

4 часа назад, post125 сказал:

Я впаивал в ESP память и 8 и 16 МБ и соответственно менял конфигурации а Arduini IDE - никакого смысла в этом нет, работает совершенно так же , как и с 4 МБ. И начальная загрузка дольше, особенно с 8 МБ. И на большом количестве датчиков точно также перестает строить тренды.

перепайка была в первую очередь интересна чтобы запустить станцию на ESP01, ESP01 и датчик BME280 получается метеостанция очень небольшого небольшого размера, но довольно функциональная

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

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

Edited by Neon

Share this post


Link to post
Share on other sites

сейчас посмотрел разметку в файле eagle.flash.4m3m.ld и возможно понял почему RSSI, вроде бя я стирал не только скетч но и всю память ESP, а там похоже хранятся какие то настройки...

 

по разметке получается для скетча всегда оставляется 1 мегабайт, остальное под SPIFFS или вообще пусто

Edited by Neon

Share this post


Link to post
Share on other sites

разобрался с RSSI, оказывается смотрел ее не подключившись к роутеру,   то есть не настроив имя и пароль для подключения к роутеру...

Share this post


Link to post
Share on other sites

установил 8 мб, скетчи работают, а вот метеостанцию запустить не удалось, похоже какая то проблема с SPIFFS

так как светодиод моргает, в монитор инфу пишет, точку доступа создает, к ней подключаюсь и все, в браузере ничего

 

 

Share this post


Link to post
Share on other sites

Доброе время суток.

13.11.2019 в 14:50, Neon сказал:

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

Нет не сложно, это все правится через HTML и CSS. В код контроллера ничего вносить не потребуется. Но Вы точно столкнетесь с проблемой быстрой выгрузки фоновой картинки если она будет храниться на SPI Flash. Если она будет не большого размера, то все будет хорошо и не придется придумывать костыли, как я это делал с облаками.

14.11.2019 в 20:13, Neon сказал:

установил 8 мб, скетчи работают, а вот метеостанцию запустить не удалось, похоже какая то проблема с SPIFFS

так как светодиод моргает, в монитор инфу пишет, точку доступа создает, к ней подключаюсь и все, в браузере ничего

Скорее всего Вы не залили файлы web сервера в вашу новую flash память. Этот этап описан в инструкции.

  • Like 1

Share this post


Link to post
Share on other sites
17.11.2019 в 00:07, Kitsum сказал:

Скорее всего Вы не залили файлы web сервера в вашу новую flash память. Этот этап описан в инструкции.

заливал, но все равно не грузилось вэб содержимое, заработало только когда указал что флеш 4 мб, но попробую еще

 

возможно ли не очень сложным способом добавить к метеостанции работу с NRF24L01+, чтобы радиомодуль принимал данные показаний датчиков и передавал их метеостанции

интересует куда вставить код работы с NRF24 и как передать данные коду метеостанции, скетч работы с NRF24 в принципе есть, возможно нужно будет немного доработать

Edited by Neon
  • Like 2

Share this post


Link to post
Share on other sites
3 часа назад, Neon сказал:

возможно ли не очень сложным способом добавить к метеостанции работу с NRF24L01+, чтобы радиомодуль принимал данные показаний датчиков и передавал их метеостанции

интересует куда вставить код работы с NRF24 и как передать данные коду метеостанции, скетч работы с NRF24 в принципе есть, возможно нужно будет немного доработать

Присоединяюсь к вопросу

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Similar Content

    • By Kitsum
      Хотите помочь проекту или спонсировать новый?
      Yandex.Money PayPal.me Тема проекта
      Arduino IDE + Project + Libraries + tools: https://yadi.sk/d/jseefFB50NMhAg
    • By Kitsum
      Просмотреть файл [esp8266] Библиотека CMD, реализует настройку микроконтроллера и управление вашей программой через терминал.
      Основная задача библиотеки, это прием пользовательских команд через UART интерфейс, их обработка и выполнение пользовательского кода, связанного с той или иной командой.
      Данная библиотека позволяет реализовать:
      Управление микроконтроллером Любую настройку, будь то WiFi, другие библиотеки или часть Вашей программы Вызывать Ваши задачи (функции) из терминала по команде и передавать им требуемые параметры Использовать контроллер в качестве шлюза между датчиками и программами на PC Внимание: любая команда, передаваемая в терминал обязана заканчиваться символом перевода строки "\n".
      Подключение библиотеки
      #include <cmd.h> Инициализация объекта, к которому мы будем обращаться для добавления команд. В качестве параметра объекту необходимо передать указатель на объект Serial или любой другой схожий по типу интерфейс.
      cmd command(&Serial); В функции Setup описываем какие команды требуется обрабатывать. Например, по команде "test" вызывать пользовательскую функцию с именем "myFunctionName". Имя пользовательской функции может быть абсолютно любым.
      void Setup() { Serial.begin(115200); command.add("test", myFunctionName); } Пользовательская функция будет вызываться каждый раз, когда по интерфейсу Serial поступит команда "test". Если команда будет передана с параметрами, то эти параметры будут переданы в качестве аргументов пользовательской функции.
      В функции loop должна находится команда вызова обработчика.
      void loop() { command.handleEvents(); } Пользовательская функция обязана соответствовать ряду требований:
      Не возвращать никакого результата (быть объявленной с типом void) Принимать в качестве первого аргумента переменную с типом byte в которой будет храниться число равное количеству переданных параметров Принимать в качестве второго параметра переменную с типом char** в которой будет храниться указатель на массив со всеми указателями (char*) на переданные параметры void myFunctionName(byte argc, char** argv) { /* ... */ } Функция всегда должна иметь такой вид, даже если не подразумевается, что ей будут передаваться какие-либо параметры.
      Чтобы перебрать все переданные параметры и вывести их в консоль, можно воспользоваться следующим примером
      void myFunctionName(byte argc, char** argv) { if (0 < argc) { for (uint8_t i = 0; i < argc; i++) { Serial.printf("%i. %s\n", i, argv[i]); } } } Пример вызова пользовательской функции без параметров и с ними
      # test No parameter was passed # test p1 p2 p3 p4 p5 0. p1 1. p2 2. p3 3. p4 4. p5 Помните, что параметры представлены в виде указателей и работать с ними нужно как с обычными переменными не получится т.к указатель содержит не значение переменной (переданный параметр), а указатель на ту область памяти микроконтроллера в которой это значение находится.
      Чтобы сравнить два значения, например, параметр под индексом 0 (идет первым в списке) с каким-либо значением в программе, воспользуйтесь функцией strcmp, которая возвращает целочисленное значение, указывающее на лексическое расхождение строк. Если строки равны, то возвращаемое значение равно 0.
      if (!strcmp(argv[0], "wifi")) { Serial.println(F("Первый аргумент WiFi")); } else { Serial.println(F("Первый аргумент НЕ WiFi!!!")); } Для копирования значения указателя в другую переменную с типом char можно воспользоваться функцией strcpy
      char myVar[20]; strcpy(myVar, argv[0]); if (myVar == "123456") { Serial.prinln(F("ok")); } Также можно обернуть указатель объектом String и получить весь функционал этого объекта, который будет содержать значение параметра
      String param1(argv[0]); // String param1 = argv[0]; Serial.printf("argv[0] length: %i\n", param1.length()); Serial.printf("argv[0] is integer?: %s\n", param1.toInt() ? "YES" : "NO"); if (param1 == "qwerty") { Serial.println(F("Hello QWERTY!")); } С библиотекой идут несколько примеров, в том числе и пример конфигурации WiFi в режиме STA.
      Автор Kitsum Добавлен 05.12.2018 Категория Библиотеки  
    • By Kitsum
      Просмотреть файл [esp8266] Библиотека smartBlink, реализует умное управление штатным светодиодом, что позволяет добавить индикацию состояния вашей программы или микроконтроллера.
      Основная задача библиотеки, это добавление индикации состояния Вашей программы или микроконтроллера. Отображение состояния производится посредством светодиода. Что самое важное, работа библиотеки через прерывание, это позволяет ей поддерживать индикацию даже в то время, когда выполняется длительный код основной программы. Например, Вы можете использовать её для отображения в каком режиме сейчас работает WiFi микроконтроллера, STA или AP и т.д. Или ход выполнения какой-либо операции, например, передача данных на внешний сервер.
      Подключение библиотеки
      #include <smartBlink.h> Чтобы инициализировать управление светодиодом необходимо создать объект, через который мы буем задавать режимы работы индикации.
      smartBlink::smartBlink(byte gpio, bool on = LOW); Объекту необходимо передать два параметра, первый это номер порта, на котором находится светодиод, а второй это уровень логического сигнала, который заставит светодиод работать. Сигнал может быть низким (LOW) или высоким (HIGH), это зависит от схемотехники подключения светодиода.
      Например, штатный светодиод модуля ESP12, использующий GPIO2 (порт 2) можно объявить следующим образом.
      #define led2_pin 2 #define led2_on_signal LOW smartBlink led2(led2_pin, led2_on_signal); Теперь можно в основной программе использовать метод устанавливающий какой режим индикации использовать.
      smartBlink::setMode(mode_t mode); Например, зададим режим светодиода led2 в котором светодиод будет давать одну короткую вспышку раз в секунду.
      led2.setMode(smartBlink::mode_flash1); Режимов работы может быть несколько.
      led2.setMode(smartBlink::mode_off); led2.setMode(smartBlink::mode_flash1); led2.setMode(smartBlink::mode_flash2); led2.setMode(smartBlink::mode_flash3); led2.setMode(smartBlink::mode_flash4); led2.setMode(smartBlink::mode_burn); led2.setMode(smartBlink::mode_inhalf); Чтобы вернуть предыдущий режим индикации для ранее объявленного светодиода led2 используйте следующий метод
      led2.previous(); Благодаря работе библиотеки через прерывания по таймеру, индикация будет работать даже в тех случаях, когда выполняется долгий код.
      С библиотекой идут несколько примеров.
      Автор Kitsum Добавлен 10.12.2018 Категория Библиотеки  
    • By Kitsum
      Основная задача библиотеки, это добавление индикации состояния Вашей программы или микроконтроллера. Отображение состояния производится посредством светодиода. Что самое важное, работа библиотеки через прерывание, это позволяет ей поддерживать индикацию даже в то время, когда выполняется длительный код основной программы. Например, Вы можете использовать её для отображения в каком режиме сейчас работает WiFi микроконтроллера, STA или AP и т.д. Или ход выполнения какой-либо операции, например, передача данных на внешний сервер.
      Подключение библиотеки
      #include <smartBlink.h> Чтобы инициализировать управление светодиодом необходимо создать объект, через который мы буем задавать режимы работы индикации.
      smartBlink::smartBlink(byte gpio, bool on = LOW); Объекту необходимо передать два параметра, первый это номер порта, на котором находится светодиод, а второй это уровень логического сигнала, который заставит светодиод работать. Сигнал может быть низким (LOW) или высоким (HIGH), это зависит от схемотехники подключения светодиода.
      Например, штатный светодиод модуля ESP12, использующий GPIO2 (порт 2) можно объявить следующим образом.
      #define led2_pin 2 #define led2_on_signal LOW smartBlink led2(led2_pin, led2_on_signal); Теперь можно в основной программе использовать метод устанавливающий какой режим индикации использовать.
      smartBlink::setMode(mode_t mode); Например, зададим режим светодиода led2 в котором светодиод будет давать одну короткую вспышку раз в секунду.
      led2.setMode(smartBlink::mode_flash1); Режимов работы может быть несколько.
      led2.setMode(smartBlink::mode_off); led2.setMode(smartBlink::mode_flash1); led2.setMode(smartBlink::mode_flash2); led2.setMode(smartBlink::mode_flash3); led2.setMode(smartBlink::mode_flash4); led2.setMode(smartBlink::mode_burn); led2.setMode(smartBlink::mode_inhalf); Чтобы вернуть предыдущий режим индикации для ранее объявленного светодиода led2 используйте следующий метод
      led2.previous(); Благодаря работе библиотеки через прерывания по таймеру, индикация будет работать даже в тех случаях, когда выполняется долгий код.
      С библиотекой идут несколько примеров.
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...