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

Вся активность

Эта лента обновляется автоматически     

  1. Последняя неделя
  2. evgenyD

    Метеостанция на ESP8266 от it4it.club

    Добрый день! тензодатчик для весов пока не приехал, жду. возник другой вопросик, не получается отправлять корректно по MQTT в одном сообщении данные по температуре, влажности и давлению. подставляется содержимое mqtt_path дважды
  3. post125

    Метеостанция на ESP8266 от it4it.club

    Благодарю за ответ! Буду пробовать. Прошу прощения за дурацкие вопросы.
  4. Kitsum

    Метеостанция на ESP8266 от it4it.club

    Что Вы имеете в виду под фигурирует, связь между двумя контроллерами по Serial? Если да, то оба контроллера подключаются друг к другу через порты RX и TX с общей землей (GND). RX подключается к TX не зависимо от того с какой стороны смотреть. Также необходимо помнить об согласовании уровней сигналов. В программе работаете с контроллерами через Serial, различия будут лишь в том, что в ESP буфер с данными формируется автоматически, а в ATmega данные получаете по одному байту и буфер нужной длинны необходимо формировать самому. Дело в том, что предоставленный пример написан под ESP 8266/32 и для них в объекте Serial есть метод printf, а вот под ATmega данного метода нет, но есть одноименная функция, приводящая к аналогичному результату. Так что для ATmega строки такого вида Serial.printf ("f1: %f\r\nf2: %f\r\n", f1, f2); приведите к такому printf ("f1: %f\r\nf2: %f\r\n", f1, f2); и все должно заработать. Вообще все строки с Serial можно удалить, я добавил их для вывода отладочной информации дабы можно было отследить как выглядит число, записанное в float при разборе на массив из 4-х byte элементов и дальнейший обратный процесс с записью значение в другую переменную. PS: прошу прощение за задержку с ответами.
  5. Ранее
  6. post125

    Метеостанция на ESP8266 от it4it.club

    что-то не хочет компилироваться: float2byte:9:3: error: stray '\357' in program Serial.printf ("f1: %f\r\nf2: %f\r\n", f1, f2); ^ float2byte:9:3: error: stray '\273' in program float2byte:9:3: error: stray '\277' in program float2byte:9:3: error: stray '\357' in program float2byte:9:3: error: stray '\273' in program float2byte:9:3: error: stray '\277' in program exit status 1 stray '\357' in program
  7. post125

    Метеостанция на ESP8266 от it4it.club

    Благодарю за ответ, буду пробовать. А если фигурирует seral, надо Мини к ESP по uartу подключать?
  8. Kitsum

    Метеостанция на ESP8266 от it4it.club

    @post125 попробуйте такой вариант разбора float на массив byte float f1 = -3.14; float f2 = 0; byte b1[sizeof(float)]; void setup() { Serial.begin(115200); Serial.println(); *(float*)b1 = f1; Serial.printf("f1: %f\r\nf2: %f\r\n", f1, f2); Serial.printf("0x%02X\r\n0x%02X\r\n0x%02X\r\n0x%02X\r\n", b1[0], b1[1], b1[2], b1[3]); f2 = *(float*)b1; Serial.printf("f1: %f\r\nf2: %f\r\n", f1, f2); } void loop() { } Передавайте этот массив и собирайте его в обратном порядке на стороне ESP.
  9. post125

    Метеостанция на ESP8266 от it4it.club

    Добрый день! Благодарю за ответ. У меня так и получается, что та ProMini , которая рядом с ESP, получает данные от пяти удаленные ProMini, причем каждая удаленная ProMini передает данные массивом от 3 до 8 параметров. Эти данные принимаются и висят в памяти этой принимающей ProMini. А вот забрать ESPшкой я не понимаю как. Подскажите, пожалуйста, где почитать как разобрать данные float (либо int) на байты и обратно. Ничего вразумительного в сети не нашел. Застрял на этой передаче данных по I2C и не вижу просвета... Заранее благодарен.
  10. Kitsum

    Метеостанция на ESP8266 от it4it.club

    Доброе время суток. @post125 В первую очередь нужно понять, что I2C и NRF это две разные транспортные линии, не рассматривайте их как единую среду передачи данных от беспроводных устройств к ESP, так ничего не выйдет. Со стороны ProMini необходимо организовать систему получения данных по беспроводному каналу их обработку и хранение в оперативной памяти. Допустим Вы получаете данные с 5-и беспроводных устройств, значит ProMini должна держать в памяти 5 разных значений с этими данными, пусть это будет float или, что угодно. Далее ESP, по мере надобности, запрашивает у ProMini данные по конкретному устройству, одному из 5-и. В ответ ProMini передает заранее преобразованное значение float с одного из датчиков в массив из 4-х byte или char и по очереди передает все элементы массива ESP. Далее проводите обратную операцию и получаете значение float. Главное помнить простую вещь, что float имеет размер в 4 byte, обращайтесь к каждому из них как к элементу массива и передавайте значение по одному byte. Таким образом получается, что ProMini является агрегатором данных со всех беспроводных устройств, работающих через NRF и передающих мастеру данные в виде массива из 4-х byte для каждого float.
  11. post125

    Метеостанция на ESP8266 от it4it.club

    Добрый день! Соединил ESP(master) c ProMini(c NRF)(slave). ProMini принимает данные с датчика через NRF и отдаёт ESP. Но возникла проблема в том, что Wire.h может передавать данные как byte или char, а через NRF я могу иередать массив из 8-ми float (либо из 16-ти int). Соответственно, ESP в serial выдаёт не то, что хотелось бы видеть. Можете подсказать, как разобрать массив из floatов на байты и после передачи обратно собрать из байтов во float? Либо, может быть, возможен другой путь?
  12. post125

    Метеостанция на ESP8266 от it4it.club

    не стал откладывать на завтра, сделал сегодня. ESPке не понравиля символ & , ответила ошибкой 500
  13. post125

    Метеостанция на ESP8266 от it4it.club

    Благодарю за ответ! Старый пароль записан, завтра проверю и найду что не понравилось ESPке.
  14. Kitsum

    Метеостанция на ESP8266 от it4it.club

    Доброе время суток. Ограничения есть только в web интерфейсе проекта, в файле index.htm Для проверки SSID применяется следующее регулярное выражение, соответствующее латинским буквам от A до Z без учета регистра, всем цифрам и дополнительным символам "_. -". Общая длинна от 3 до 30 символов включительно. function checkSSID(ssid) { return ssid.match(/^[a-z0-9_. -]{3,30}$/i); } Для пароля все еще проще, это от 5 до 63 любых символов function checkPassw(passw) { return passw.match(/^.{5,63}$/); } Это говорит о том, что Вы проходите проверку на стороне web интерфейса ESP8266. Следовательно, причина кроется на стороне микроконтроллера. В первую очередь будет вызван один из методов web сервера, отвечающий за обработку пользовательских запросов. Файл webserver.h По сути тут будет проведена проверка на авторизацию пользователя и передача новых параметров вашему объекту конфигурации через вызов его метода config::write(String apiSave) Файл config.h Метод перебирает все доступные ему параметры, находящиеся в оперативной памяти и перезаписывает значения для тех из них чьи имена упоминались в списке, переданном web интерфейсом. Далее записывает данные в конфигурационный файл находящийся во Flash памяти. Могу предположить, что причина кроется в обработке некоторых символов библиотекой ArduinoJson в методе config::write(String apiSave), что приводит в отказу от записи конфигурации. json.success() Попробуйте в файле webserver.h добавить код ответа 500 для подобного события в метод http::api_settings(), приведите его к следующему виду void http::api_settings() { this->sendServerHeaders(); this->sendHeader("Cache-Control", "no-store, no-cache"); if (!this->security()) this->send(403); else if (this->authorized()) { if (this->hasArg(F("save"))) { if(!conf.write(this->arg(F("save")))) this->send(500); else this->send(200, headerJson, conf.showSecureConfig()); } else this->send(200, headerJson, conf.showSecureConfig()); } else this->send(401); } В теории, если ошибка происходит на уровне json формата, то она должна появиться с сообщением 500 Internal Server Error Если причина действительно в этом и Вам удастся выловить символ, то дайте мне знать какой он.
  15. post125

    Метеостанция на ESP8266 от it4it.club

    Заменил пароль на буквенно-цифровой, стало сохраняться.
  16. post125

    Метеостанция на ESP8266 от it4it.club

    Добрый вечер! Есть ли какие либо ограничения по используемым символам в SSID и пароле. Не могу понять , почему к одной сети подключается, а к другой нет. И то сохраняет настройки сети в вебинтерфейсе, то нет.(не ругается, пишет, что сохранено, но при перезагрузке контроллера или страницы остаются старые значения)
  17. post125

    Метеостанция на ESP8266 от it4it.club

    Спасибо, буду пробовать. К ESP будет подключен только один датчик BME280 по i2c для давления, темп и влаж в помещении. Всё остальное через ардуину (скорее Нано) с приемнком NRF. Каждый передатчик NRF может за раз передать массив из 8 floatов, из них 1 уйдёт на напряжение батареи. Поскольку каждая NRF передает данные в своей трубе, то идентификатор передавать не надо. 7 floatов остается на датчики. И таких NRF можно подключить 5шт. (не строя сеть для экономии батарей). Полагаю, мне этого хватит.
  18. Kitsum

    Метеостанция на ESP8266 от it4it.club

    Как мне кажется, эта библиотека не подойдет, но проверить конечно же стоит. Я бы копал в сторону стандартной библиотеки Wire.h как для AVR контроллеров (Atmega ...) так и для ESP, ищите их в вашей Arduino IDE. Также надо учитывать, что для этих контроллеров библиотеки разные. Например, ESP может работать только в качестве Master устройства, что в принципе и требуется, а вот AVR контроллеры могут работать в Master/Slave режиме. Это можно подсмотреть в заголовочных файлах (.h) их библиотек. Также для начала будут очень полезны эти материалы: https://www.arduino.cc/en/Reference/Wire https://www.arduino.cc/en/Tutorial/MasterReader https://www.arduino.cc/en/Tutorial/MasterWriter https://forum.arduino.cc/index.php?topic=336543.msg2321656#msg2321656 (стоит ознакомиться с возможными проблемами, прочтите всю тему) Также помните о подтягивающих резисторах на SDA и SCL т.к они не отражены на схемах. Они понадобятся если Вы соединяете два контроллера между собой, но если на шине установлен какой ни-ть Китайский датчик, то очень велика вероятность, что резисторы уже есть. И еще один важный момент, это согласование уровней сигнала т.к ESP работает от 3.3V, а для ATmega стандартом является 5V, но они могут поддерживать и 3.3V. В любом случае, Вы должны гарантировать, что рассогласования уровней сигнала не будет. Лично мне нравится вариант, когда оба контроллера имеют питание 3.3V, так можно питать Slave от Master и не ставить плату согласования, но это зависит от конкретных задач, этот вариант не всегда приемлем. После того, как Вы научитесь передавать данные между контроллерами, копайте в сторону файла sensors.h в проекте. Вам нужен метод add, а точнее разобраться в параметрах, передаваемых ему. Один из параметров указывает какую функцию нужно вызвать чтобы получить данные от датчика, вот в этой функции и стоит описывать код запроса данных от Slave и дальнейший их разбор. Описание для интерфейса knob_t *sensor_knob_cfg = new knob_t(0, 100, "1", "Что показывает", "Ед. измер."); Функция сбора данных float getSensorData() { float value = 0; /* Тут описываем работу с Slave по i2c, результат записываем в value */ return value; } Добавление датчика sensors.add(sensor_knob_cfg, device::out, "sensor_uid", getSensorData); Это очень грубый пример одного из вариантов. В проекте много примеров реализации и есть некоторое количество комментариев, не стесняйтесь изучать содержимое файлов проекта, таких как sensors.h. Очень велика вероятность, что после изучения их содержимого у Вас появится свое видение как это должно быть реализовано, и это очень хорошо.
  19. Спасибо за ответ! Буду пробовать, отпишусь о результате по ходу процесса.
  20. Kitsum

    Метеостанция на ESP8266 от it4it.club

    Доброе время суток. @Дмитрий Давайте попробуем, но я заранее предупреждаю, что Вам придется самостоятельно проводить все испытания. Я лишь постараюсь помочь с рекомендациями относительно данного проекта. И так. На сколько я понял, общая идея заключается в подсчете импульсов чашечного анемометра. Самый верный путь, это регистрировать импульсы по прерыванию т.к это не тратит драгоценное время ЦП. Далее, опираясь на частоту импульсов вычислять расстояние, которое прошел анемометр как будто это колесо автомобиля, а уже из этих данных выводить скорость. Стоит учитывать, что при расчете частоты нужно брать время между предыдущим и текущим расчетом скорости ветра, а не фиксированный интервал т.к есть и другие задачи время выполнения которых может меняться, а микроконтроллер выполняет код в реальном времени без распараллеливания задач. В первую очередь необходимо определиться, какой порт микроконтроллера будем задействовать. Я возьму за основу порт GPIO14. Он уже был задействован в проекте, поэтому в основном файле необходимо закомментировать вызов функции, которая его занимает. //gpio_14(); // Расхождение расчетной абсолютной влажности между показаниями с двух датчиков, например, BME280 Теперь порт свободен и можно преступать к коду анемометра. Мне не известно какие датчики Вы еще используете поэтому всё дальнейшее описание я буду делать так, как будто у меня только один этот датчик, так будет более понятно. Выберите пользовательский файл в котором будите работать, это любой .h файл начинающийся с префикса users_ или создайте новый файл со своим уникальным именем, например users_wspeed.h. Выбранный Вами файл должен быть подключен через оператор include в основном файле программы, другие пользовательские файлы должны быть закомментированы. Для себя я выбрал вариант с новым файлом users_wspeed.h //#include "users_auto.h"; // Пользовательская конфигурация датчиков, именно тут описывается с какими датчиками работать //#include "users_bme280_x2.h"; // Пример для двух датчиков BME280 (несовместим с users_auto.h) //#include "users_multiple_ds18b20.h"; #include "users_wspeed.h"; Весь код в этом файле должен быть заключен в конструкцию такого вида #ifndef USERS_H #define USERS_H /* Весь код описанный ниже располагается тут */ #endif Это указания для компилятора, на тот случай если в коде окажутся подключены два пользовательских файла. Теперь добавим описание для плагина Knob который отобразит наш сенсор в web интерфейсе. Установим приделы шкалы от 0 до 40 метров в секунду с шагом в одну десятую и соответствующим описанием. /* Параметры индикаторов web интерфейса для плагина Knob Мин Макс Шаг Заголовок Ед. измер. |---------------------|----|------|------|--------------|---------| */ knob_t *S = new knob_t(0, 40, ".1", "Скорость в.", "м/c"); Теперь объявим все необходимые константы. Обязательно укажите значения, подходящие для Вашего датчика. Учтите количество импульсов на один полный оборот, радиус анемометра и коэффициент для калибровки датчика. По сути этот коэффициент равен расхождению в скорости (м/c) между показаниями Вашего датчика и какого ни-ть эталонного, например другого анемометра. Можно собрать анемометр, покататься с ним на машине и сравнить показания, только помним о переводе км/ч в м/c. Я надеюсь, что зависимость линейная и все будет в порядке. /* Параметры конфигурации для расчета скорости ветра */ #define windSpeed_Pin 14 // GPIO микроконтроллера к которому подключен чашечный анемометр #define windSpeed_Pulses 1 // Количество импульсов на один оборот чашечного анемометра #define windSpeed_Correction 0 // Коэффициент поправки. Разница в скорости м/с между измеренным и фактическим значением полученная при калибровки #define windSpeed_Radius 100 // Радиус чашечного анемометра от центра до середины чашечки в милиметрах Объявим переменные для хранения показаний частоты и расчетной скорости. uint32_t windSpeed_Hz = 0; // Тут будет зафиксирована частота за ПЛАВАЮЩИЙ интервал времени float windSpeed = 0; // Тут будет зафиксирована скорость ветра Далее опишем функцию, которая будет вызываться по прерыванию и изменять показания частоты /* Функция, регистрирующая импульсы с чашечного анемометра */ void pulseDetected() { ++windSpeed_Hz; } Переходим к основной функции, отвечающей за расчет скорости ветра. Обязательно все за мной перепроверяйте т.к я мог ошибиться в расчетах или что-то сделать не так. На время расчетов мы выключаем регистрацию новых импульсов. За время мы возьмем интервал между предыдущим вызовом этой функции и текущим. Рассчитаем длину окружности и общий пройденный путь. Полученный результат запишем в одну из объявленных ранее глобальных переменных. /* Функция, производящая расчет скорости ветра */ void pulseCounter() { detachInterrupt(windSpeed_Pin); // Отключаем регистрацию импульсов на время расчета /* Расчет скорости ветра */ if (windSpeed_Hz) { float time = cron.lastRun("Wind Speed Calculation") / 1000; // Время прошедшее с последнего расчета скорости ветра в секундах float circumference = 3.14 * 2 * windSpeed_Radius; // Длинна окружности анемометра в милиметрах float distance = (windSpeed_Hz / windSpeed_Pulses) * circumference; // Пройденое растояние в милиметрах float speed = distance / time / 1000; // Скорость в метрах в секунду (грязная) windSpeed = speed + windSpeed_Correction; // Скорость ветра с учетом коректировки } else windSpeed = 0; /* Сброс частоты */ windSpeed_Hz = 0; attachInterrupt(windSpeed_Pin, pulseDetected, FALLING); // Возобновляем регистрацию импульсов } Опишем функцию возвращающую расчетный результат скорости. /* Функция, возвращающая последнее расчетное значение скорости ветра */ float getWindSpeed() { return windSpeed; } Ну и осталось самое главное, это функция описывающая наши сенсоры. void sensors_config() { pinMode(windSpeed_Pin, INPUT_PULLUP); // Конфигурируем порт микроконтроллера как вход с активным встроенным подтягивающим резистором attachInterrupt(windSpeed_Pin, pulseDetected, FALLING); // Регистрация импульсов с чашечного анемометра по прерыванию на землю cron.add(cron::time_10s, pulseCounter, "Wind Speed Calculation"); // Задача в планировщике для расчета скорости ветра sensors.add(S, device::out, "windSpeed", getWindSpeed); // Добавляем сенсор скорости ветра в web интерфейс } Как мы видим, тут происходит инициализация порта микроконтроллера на вход с подтяжкой к питанию. Объявление прерывания. А также добавление задачи по расчету скорости в планировщик и добавление нашего сенсора. Еще раз напоминаю, что я не могу гарантировать работоспособность данного решения, у меня нет возможности это проверить. Внимательно все просмотрите, я постарался везде указать комментарии. Помните, что импульсы считаются по прерыванию на землю, Вы должны гарантировать, что схема датчика будет их генерировать. На всякий случай прикрепляю готовый файл. users_wspeed.zip
  21. post125

    Метеостанция на ESP8266 от it4it.club

    Добрый день! За прошедшее время освоил передачу данных через NRF24 с датчиков , подключенных к ProMini . И прием данных на Мегу с выводом на экран . Теперь в раздумье, как забрать ESPшкой с Меги (или Нано) полученные данные датчиков. Как Вы уже рекомендовали, хочу подключить Ардуину как slave к ESP по I2C. Нашел библиотеку iarduino_I2C_connect для этих целей. Думаю, должно получиться. А вот как потом эти данные переварить в ESP и отправить в локальный web-сервер и (или) народный монитор? Подскажите, пожалуйста, куда копать, а то несколько дней никак не могу сообразить, с чего начать. PS: пробывал перепаивать на ESP 64Mbit и 128Mbit флеш , программировал как Generic ESP8266 module в формате 8(7SPIFFS) и 16(15SPIFFS). Ваша метеостанция работает, в веб-интерфейсе корректно отображается размер установленной памяти. Так что запас для модификации веб-интерфейса есть.
  22. Добрый день! Для начала хочу поблагодарить Вас за отличный проект! Хотелось бы добавить в сборку анемометр, об этом уже был разговор в теме. Можно использовать кулер процессора на примере вот этого проекта: http://kiteforum.org.ua/index.php?topic=7613.0. Если Вам не сложно, помогите добавить код для считывания показаний и передачей по MQTT в сборку.
  23. Ничем не отличается. Разницы нет, это просто уникальные идентификаторы для подсетей.
  24. Ды чем она может отличаться. ЭтАж php... Не?
  25. Maerhekil

    Рекурсивное изменение прав в Linux

    смена прав всех директории и поддиректории find /usr/local/www/ -type d -exec chmod 755 {} + смена прав всех файлов в директории и поддиреткории Не благодари...
  26. evgenyD

    Метеостанция на ESP8266 от it4it.club

    Спасибо огромное , по результату сразу отпишусь
  1. Загрузить больше активности
×
×
  • Создать...