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

Рекомендованные сообщения

10 часов назад, EVG сказал:

файл index.html находится в архиве проекта : ESP8266_WS_V2.0_iT4IT.CLUB.7z

 

3 часа назад, Maikl9999 сказал:

Пока отлаживаешь index.html, архивировать его не обязательно

Большое спасибо за подробности! Все стало понятно😊

Отдельное огромное спасибо  Kitsum  за отличный проект, вполне пригодный для реализации даже "новичками"!

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@Maikl9999 Пока отлаживаешь index.html, архивировать его не обязательно, он зальётся и так, только места больше будет занимать
Да, согласен. Можно и так.

@Maikl9999 Кстати не всякий архиватор правильно архивирует  в  расширение  .gz,   винраром у меня не получалось, а вот 7-zip само то. Редактировать лучше программой Notepad++.
А тут кто как привык.  Лично я  пользуюсь фм "Far" и для рас/запаковки архивов и для редактирования. Но это не суть, это вопрос удобства, вполне можно и блокнотом обойтись. И поиском в Гугле "как правильно запаковать в архив *.gz под windows" )

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 10.06.2018 в 04:56, EndWar сказал:

и вставляешь в index.htm...

Ткните носом в каком месте файла - для меня html "тёмный лес"

Спасибо...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, PulFred сказал:

Ткните носом в каком месте файла - для меня html "тёмный лес"

Примерно здесь , в районе строки 600-700, у кого как,  (выше прогноза погоды- часы).

		<div prototype hidden>
            <div class="sensor">
                <div class="title">{title}</div>
                <div class="unit">{unit}</div>
                <input class="knob {name}" data-width="200" data-displayPrevious=true data-fgColor="#FFF" data-skin="tron" data-thickness=".1" value="0" data-min="{min}" data-max="{max}" data-step="{step}" readonly>
            </div>
        </div>
    </div>
	
	<script type="text/javascript">  
		setInterval(function () {  
			date = new Date(),  
			h = date.getHours(),  
			m = date.getMinutes(),  
			s = date.getSeconds(),  
			h = (h < 10) ? '0' + h : h,  
			m = (m < 10) ? '0' + m : m,  
			s = (s < 10) ? '0' + s : s,  
			document.getElementById('time').innerHTML = h + ':' + m + ':' + s;  
			}, 1000);  
	</script>
	
<a class="weatherwidget-io" href="https://forecast7.com/ru/55d5245d47/sergach/" data-label_1="Прогноз погоды" data-label_2="Сергач"data-font="Arial Black" data-icons="Climacons Animated" data-theme="original" data-basecolor=transparent data-accent="" data-textcolor="#000000" data-highcolor="#ff0000" data-lowcolor="#00173a" data-suncolor="#f2c300" data-cloudcolor="#0612db" data-cloudfill="#ffffff" data-raincolor="#599dff" >СЕРГАЧ</a>

</div>
</body>
<script src="jquery.min.js"></script>
<script src="jquery.knob.min.js"></script>
<script src="md5.js"></script>
<script src="highcharts.js"></script>
<script>

 

Изменено пользователем Maikl9999
  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 30.06.2018 в 02:55, Maikl9999 сказал:

Примерно здесь , в районе строки 600-700...

Попытки вставки кода (и со своими данными, и с Вашими) - результата не дают. При просмотре файла (после вставки кода) index.hml по F3, на странице появляется строчка из нечитабельных символов, клик по которой открывает сайт с прогнозом. Может это как-то связано с кодировкой?

Куда копать?... 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
11 часов назад, PulFred сказал:

При просмотре файла (после вставки кода) index.hml по F3,

Чем смотришь? Установи программу Notepad++, она бесплатная  и думаю для тебя будет удобная.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
12 часов назад, Maikl9999 сказал:

Чем смотришь? Установи программу Notepad++

Мой упакованный в *.gz файл index.htm после вставки кода. Дополнительно упакован в *.zip для пересылки (смотри разрешенные типы файлов).

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

Как-то так.

index.htm.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Классный проект!!!

Повторил месяца 3-4 назад, подправил под себя.... и забыл пароль :)

Как можно сбросить?

И заодно - мне под мои цели интересней видеть график давления за 3-5 дней, можно за счет освещенности (вообще не нужен), влажности

как сделать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, PulFred сказал:

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

Как-то так.

Попробуй этот. Перед использованием убери из имени архива буквы zip. Город подправь.

index.htm.gz.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
6 часов назад, afvar сказал:

Повторил месяца 3-4 назад, подправил под себя.... и забыл пароль

Наверное повторить проект снова😊

 

6 часов назад, afvar сказал:

И заодно - мне под мои цели интересней видеть график давления за 3-5 дней

Ну это скорей всего к Автору - Kitsum Вам в помощь

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 29.06.2018 в 15:31, EVG сказал:

@Maikl9999 Пока отлаживаешь index.html, архивировать его не обязательно, он зальётся и так, только места больше будет занимать
Да, согласен. Можно и так.

@Maikl9999 Кстати не всякий архиватор правильно архивирует  в  расширение  .gz,   винраром у меня не получалось, а вот 7-zip само то. Редактировать лучше программой Notepad++.
А тут кто как привык.  Лично я  пользуюсь фм "Far" и для рас/запаковки

Здравствуйте. Я использую 7-zip. Открыть с помощью 7zip/  редактировать файл (откроется в notepad++), редактирую/сохраняю/закрываю 7zip (иначе не сохранит) и заливаю в esp

  • Thanks 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Выше выложил свой файл index.htm - распакован, отредактирован, сохранён, запакован и залит в ESP, но увы результата нет.

Позже попробую по Вашей методике с файлом от Maikl9999 , о результате сообщу

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
59 минут назад, PulFred сказал:

Выше выложил свой файл index.htm - распакован, отредактирован, сохранён, запакован и залит в ESP, но увы результата нет.

У Вас кодировка меняется на каком то этапе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

В 02.07.2018 в 06:21, afvar сказал:

Повторил месяца 3-4 назад, подправил под себя.... и забыл пароль :)

Как можно сбросить?

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

  1. В основном файле проекта, практически в самом начале, имеется описание констант отвечающих за инициализацию Serial монитора. 
    /* Консоль */
    #define console Serial    // Обязательно закомментируйте эту строку перед финальной загрузкой программы
    #define consoleSpeed 115200

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

  2. Еще один вариант, это затереть конфигурационный файл, но сделать это можно только загрузив по новой файлы WEB сервера. Эта операция полностью удаляет текущее содержимое области флешь памяти, выделенную под внутривенную файловую систему и записывает её новый образ. При этом файл конфигурации в образе отсутствует и будет создан самим контроллером в ходе выполнения программы. Данные авторизации будут сброшены по умолчанию - admin\admin

  3. Еще один способ подразумевает обновление программы микроконтроллера и игнорирование части конфигурационного файла или его удаление, но тогда обновлять программу придется дважды. Второй раз чтобы откатить изменения и восстановить функционал. Для этого в файле webserver.h найдите функцию bool http::authorized() она отвечает за проверку авторизации пользователя с помощью cookies. Приведите её к следующему виду.

    bool http::authorized() {
      return true;
    }

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

В Вашем случае другого способа перехватить пароль нет т.к он передается только от пользователя к микроконтроллеру и никогда в обратную сторону. Подбор пароля тоже усложнен т.к лимит попыток входа ограничен и Вы вероятно спровоцируете тревогу поднятую функцией bool http::security() её описание и подробный комментарий также можно посмотреть в файле webserver.h

Это первое, что приходит в голову, но если вы найдете другой способ, то дайте знать, буду очень признателен.

Теперь о графиках и выхода за приделы суточного интервала.

Графики отъедают очень много памяти, да и сам проект про то как получилось у меня, а не как стоит делать, но все же. Вам предстоит внимательно поработать с несколькими файлами:

  1. Файл sensors.h в котором описана логика работы с сенсорами. В описании класса sensors имеется приватная переменная содержащая размер массива выделяемого под хранение лога для каждого сенсора в котором эти самые логи активированы.
    byte logSize = 144;

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

    byte logSize = 432;     // Вариант для трех дней
    byte logSize = 144 * 5; // Или иной вариант записи для 5-и дней (по мне такой вариант записи более предпочтителен)

    Главное не перегнуть палку, всегда следите за памятью.

  2. Файл users_auto.h или users_bme280_x2.h или Ваш файл, в котором описаны используемые сенсоры. Вот пример описывающий датчик температуры.

    sensors.add(T, device::out, 0x76, "out_temperature", out_init, out_temp, true);

    Последнее значение метода add, то которое true, указывает, что необходимо вести логи. У тех сенсоров, для которых не требуется видение логов, не указывайте это значение вообще или измените его на false. Оставьте только действительно необходимые логи.

  3. Файл index.htm содержит две функции в которых производится построение графика

    $(".sensor .log").click(function(){
    	/* ... */
    });
    
    $("#graph").click(function() {
    	/* ... */
    });

    Обе эти функции содержат расчетное временное значение первой точки графика в мс.

    new Date().getTime() - obj.timeAdjustment - 143 * 10 * 60 * 1000;

    Необходимо сдвинуть его на выбранный вами интервал времени, например, три дня.

    new Date().getTime() - obj.timeAdjustment - (144 * 3 - 1) * 10 * 60 * 1000;

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

  4. Сохраняем и обновляем программу и файлы.

Что касаемо самих файлов WEB сервера и их упаковки:

  1. Как все уже правильно заметили, файлы упакованы только для уменьшения их размера, можно использовать их без сжатия. Но при наличии у микроконтроллера сжатого файла и его не сжатой копии, приоритет будет отдан сжатому файлу и именно он будет отдан пользователю при загрузке страницы.
  2. Оригинальные файлы сжаты с помощью архиватора 7-Zip. Формат сжатия GZIP, уровень сжатия Ультра (максимально возможный).
  3. Исходный код файлов написан в кодировке UTF-8

Сугубо мое мнение: если Вы хотите внести серьезные изменения в код, то стоит воспользоваться специализированным редактором, который сможет предупредить об опечатки или нарушении синтаксиса. Рекламировать ничего не буду, в сети множество редакторов для WEB разработок с поддержкой HTML и JavaScript

  • Like 1
  • Thanks 3

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
4 часа назад, Kitsum сказал:

Обе эти функции содержат расчетное временное значение первой точки графика в мс.


new Date().getTime() - obj.timeAdjustment - 143 * 10 * 60 * 1000;

Необходимо сдвинуть его на выбранный вами интервал времени, например, три дня.


new Date().getTime() - obj.timeAdjustment - (144 * 3 - 1) * 10 * 60 * 1000;

Попробовал. Почему то первая точка на графике не соответствует дате и времени .

Изменено пользователем Maikl9999

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В процессе экспериментов с внедрением на страницу прогноза погоды активировал в Arduino IDE Меню-Инструменты- Sketch Data Upload, в результате перезалилась SPIFF , после чего в браузере пропал доступ странице. Подскажите, пожалуйста как восстановить прежнее работающее  состояние или в ESP8266 сбросить настройки Wi-Fi 

Спасибо

Изменено пользователем PulFred

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
12 часов назад, Maikl9999 сказал:

Попробовал. Почему то первая точка на графике не соответствует дате и времени .

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

Попробуйте вариант со сдвигом на каждые сутки (например, для трех суток).

new Date().getTime() - obj.timeAdjustment - (143 * 3) * 10 * 60 * 1000;

 

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

В процессе экспериментов с внедрением на страницу прогноза погоды активировал в Arduino IDE Меню-Инструменты- Sketch Data Upload, в результате перезалилась SPIFF , после чего в браузере пропал доступ странице. Подскажите, пожалуйста как восстановить прежнее работающее  состояние или в ESP8266 сбросить настройки Wi-Fi 

Спасибо

На данный момент Вы должны иметь контроллер без конфигурационного файла и при перезагрузке он поднимает собственную точку доступа с именем WeatherStation, без пароля. Подключитесь к ней и настройте контроллер по своим потребностям. Страница для доступа к WEB серверу располагается по адресу http://espws.local (если поддерживается mDNS протокол) или http://192.168.4.1/ в противном случае.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
39 минут назад, Kitsum сказал:

На данный момент Вы должны иметь контроллер...

 Спасибо за подсказку. Всё восстановил, всё работает как прежде за исключением того, что так и не получилось вживить прогноз в страницу  с показаниями датчиков.

 Я уже задавал вопрос по поводу "будки", может у Вас есть ссылка изготовления (3D печати)на заказ такой как  реализована в проекте. Буду признателен... 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Kitsum сказал:

Попробуйте вариант со сдвигом на каждые сутки (например, для трех суток).


new Date().getTime() - obj.timeAdjustment - (143 * 3) * 10 * 60 * 1000;

На графике первая точка 1июля, время 16:17, а на ПК  3 июля, время 10:37.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
11 часов назад, PulFred сказал:

Я уже задавал вопрос по поводу "будки", может у Вас есть ссылка изготовления (3D печати)на заказ такой как  реализована в проекте. Буду признателен... 

Файлы  3D модели для печати будки Стивенсона идут в дополнительном архиве вместе с прошивкой, также в первом посте есть ссылка на эти же файлы но от самого автора модели. Я заказывал печать просто по объявлению, найденному в одной из социальной сети, главным критерием было производство на территории моего города. Цена вопроса 100р за каждую секцию, итого 600р. Думаю, что вам стоит поступить точно также и найти печать в своем регионе. Это также избавляет от рисков повреждения во время транспортировки, как работает почта России объяснять не нужно. Но уж если будут сложности, тогда пишите в приват, договоримся о заказе в моем городе и переправке к Вам.

11 часов назад, Maikl9999 сказал:

На графике первая точка 1июля, время 16:17, а на ПК  3 июля, время 10:37.

Да, я поспешил и упустил из внимания, что для ключевых элементов хранения логов выделен тип byte, что приводило к переполнениям и в последствии к сбоям в расчетах.

И так, необходимо внести еще ряд правок в файле sensors.h

  1. В классе device имеется одноименная функция (конструктор) device в описании параметров которого имеется параметр byte log, тип byte необходимо заменить на uint16_t
    device(knob_t *knob, list_t list, byte address, const char *name, initFn_t init, dataFn_t data, uint16_t log, device *next) {
    	/* код убран для уменьшения размера блока */
    }
  2. Аналогичную операцию замены типа необходимо провести в классе device у переменной byte logPosition и привести её к следующему виду

    uint16_t logPosition = 0;
  3. В классе sensors проводим аналогичную операцию с приватной переменной byte logSize

    uint16_t logSize = 144 * 3;

    В примере я указал три дня, Вы выставляете свое значение.

  4. В классе sensors имеется функция json sensors::log(device *sensor) отвечающая за формирование списка в формате json для передачи его в WEB интерфейс, её необходимо привести к следующему виду.

    json sensors::log(device *sensor) {
      String log;
      if (sensor) {
        if (sensor->log) {
          for (uint16_t i = sensor->logPosition; i < this->logSize; i++) {
            log += (log.length() ? "," : "") + this->clear(sensor->log[i]);
          }
          for (uint16_t i = 0; i < sensor->logPosition; i++) {
            log += (log.length() ? "," : "") + this->clear(sensor->log[i]);
          }
          if (log.length()) log = "\"" + String(sensor->name) + "\":[" + log + "]";
        }
      } return log;
    }

    По сути мы просто в двух циклах for изменили тип переменной i с byte на uint16_t и позволили циклам проходить по всему диапазону данных.

  5. В файле index.htm дату формирования первой точки вычисляем по первоначальной формуле

    new Date().getTime() - obj.timeAdjustment - (144 * 3 - 1) * 10 * 60 * 1000,

     

Все должно получиться, но на всякий случай прикладываю файл sensors.h со всеми правками. Естественно файл устареет со временем, что может повлиять на работоспособность при совместной работе в будущих версиях, если конечно обновления будут востребованы сообществом.

sensors.zip

  • Thanks 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
9 часов назад, Kitsum сказал:

Все должно получиться, но на всякий случай прикладываю файл sensors.h

Да, всё вроде бы получилось! Переделаю опрос через 30минут и увеличу время графика до недели. Спасибо за помощь!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

В 16.01.2018 в 03:31, RusD сказал:

 


#include "SSD1306.h" // добавил библиотеку
  
// инициализация OLED-дисплея с помощью библиотеки Wire:
 SSD1306  display(0x3c, D2, D1);

В void setup добавил
  
  display.init();
  display.flipScreenVertically();
  display.setFont(ArialMT_Plain_16);
  display.setTextAlignment(TEXT_ALIGN_LEFT);

В void readSensors() изменил и добавил строки:

/* BME280 */
#ifdef TG_BME_280_I2C_H
    if (temperature.status) BME.read(pressure.data, temperature.data, humidity.data, BME280::TempUnit_Celsius, BME280::PresUnit_torr);
    display.clear();
    display.drawString(0, 0, "Temperature: " + String(temperature.data) + "C");
    display.drawString(0, 16, "Humidity: " + String(humidity.data) + "%\t");
    display.drawString(0, 32, "Pressure: " + String(pressure.data) + "mmHg");
  #endif

И добавил в
  
void loop() {
  
  display.display();

 

 

Уточню, что не понял, куда можно вставить эту часть кода

display.clear();
display.drawString(0, 0, "Temperature: " + String(temperature.data) + "C");

 

Изменено пользователем Dark FeniX

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
15 часов назад, Dark FeniX сказал:

Пытаюсь разобраться с подключением дисплея

Где-то нашёл на просторах inter-, runet-a (с учетом доработок под себя):

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

#include "Wire.h"
#include "Adafruit_Sensor.h"
#include "Adafruit_BME280.h"
#include "SSD1306Wire.h"

const float SEA_LEVEL_PRESSURE_HPA = 1013.25;
const int DELAY = 3000;
const int STARTUP_DELAY = 500;

Adafruit_BME280 bme;

SSD1306Wire display(0x3c, D3, D5);

void setup() 
{
 Serial.begin(115200);
 Wire.begin(D6, D5);
 Wire.setClock(100000); 
 if(!bme.begin())
 {
 Serial.println("Could not find a valid BME280 sensor, check wiring!");
 while (1)
 {
 yield();
 delay(DELAY);
 }
 }
 delay(STARTUP_DELAY);

 display.init();
 display.flipScreenVertically();

}

void loop() 
{
 float tempC = bme.readTemperature();
 float humidity = bme.readHumidity();
 float pressurePascals = bme.readPressure();

// Print to serial monitor
 printToSerial(tempC, humidity, pressurePascals);

// Display data on screen in metric units
 drawWithMetricUnits(tempC, humidity, pressurePascals);
 yield();
 delay(DELAY);
}

void drawWithMetricUnits(float tempC, float humidity, float pressurePascals)
{
 float pressureHectoPascals = pressurePascals / 100.0;
 
 display.clear();
 
 display.drawRect(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT);
 
 display.setFont(ArialMT_Plain_16);
 display.drawString(35, 3, "BME280");
 
 display.setFont(ArialMT_Plain_10);
 display.drawString(5, 22, "Temperature = " + String(tempC) + " *C");
 display.drawString(5, 35, "Humidity = " + String(humidity) + "%");
 display.drawString(5, 48, "Pressure = " + String(pressureHectoPascals) + " h,Pa");
 
 display.display();
}

void printToSerial(float tempC, float humidity, float pressurePascals)
{
 // Temperature
 float tempF = 9.0/5.0 * tempC + 32.0;

 Serial.println("Temperature:");
 printValueAndUnits(tempC, "*C");
 printValueAndUnits(tempF, "*F");
 //printValueAndUnits(tempC, "°C");
 //printValueAndUnits(tempF, "°F");
 Serial.println("");

// Barometric pressure
 float pressureHectoPascals = pressurePascals / 100.0;
 float pressureInchesOfMercury = 0.000295299830714 * pressurePascals;

 Serial.println("Pressure:");
 printValueAndUnits(pressurePascals, "Pa");
 printValueAndUnits(pressureHectoPascals, "hPa");
 printValueAndUnits(pressureInchesOfMercury, "inHg");
 Serial.println("");

// Humidity
 Serial.println("Humidity:");
 printValueAndUnits(humidity, "%");
 Serial.println("");

// Approximate altitude
 float altitudeMeters = bme.readAltitude(SEA_LEVEL_PRESSURE_HPA);
 float altitudeFeet = 3.28 * altitudeMeters;
 
 Serial.println("Approx. Altitude:");
 printValueAndUnits(altitudeMeters, "m");
 printValueAndUnits(altitudeFeet, "ft");
 Serial.println();
}

void printValueAndUnits(float value, String units)
{
 Serial.print(" ");
 Serial.print(value);
 Serial.print(" ");
 Serial.println(units);
}

 

Вроде как работает:

image.thumb.png.32d29f7a09ac7816f72777bceb11b75b.png

 

  • Thanks 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@Dark FeniX если необходимо добавить что-то свое (без модификаций основного кода), то действуйте точно также как если бы писали все с нуля. Работайте с основным файлом. Подключайте необходимые библиотеки, объявляйте переменные, дорабатывайте содержимое setup и loop, в общем делайте все как обычно опираясь на примеры, идущие в комплекте с используемыми библиотеками.

Что касаемо упоминаемого кода, то он не действителен для текущей версии проекта поэтому давайте рассмотрим, как это должно выглядеть на текущий момент. 

  1. Допустим Вас интересует библиотека https://github.com/ThingPulse/esp8266-oled-ssd1306, будем опираться на её примеры для дисплея ssd1306 подключенного по i2c шине. Все работы будем проводить в основном файле проекта (.ino)
  2. Подключаем библиотеку и объявляем переменные
    #include "SSD1306Wire.h"  // Подключаем интересующую нас библиотеку
    SSD1306Wire display(0x3c, 4, 5); // Объявляем переменную через которую будем работать с дисплеем

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

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

    void displayWeather() {
      display.clear(); // Очищаем дисплей
      display.setFont(ArialMT_Plain_10); // Устанавливаем шрифт 
      display.setTextAlignment(TEXT_ALIGN_CENTER); // Указываем выравнивание
      display.drawString(64, 22, "Temperature " + String(sensors.get("out_temperature"))); // Выводим температуру
      display.display(); // Производим отрисовку данных
    }

    Сделать это можно, например, сразу перед функцией Setup или в любом месте файла если Вы используете актуальную версию Arduino IDE

  4. В функции Setup описываем инициализацию дисплея

    display.init(); // Инициализация дисплея
    display.flipScreenVertically(); // Переворачивает дисплей верх ногами (если требуется)

    Сделать это можно прямо в конце этой функции

  5. И следом после этого, также в функции Setup, добавляем новую задачу в планировщик задач

    cron.add(cron::minute, displayWeather, true);

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

Выглядеть это будет примерно так (все работы произведены в одном файле).

image.png

И еще хочу добавить, что я просто взял первую попавшуюся библиотеку и основываясь на одном из примеров и описанию методов от разработчика набросал вышеупомянутый список. Проверить полную работоспособность не могу т.к у меня попросту нет данного дисплея. Но суть и принципы реализации должны быть понятны. Таким же образом можно организовывать работу с другой периферией, например, управлять внешним освещением на дачном участке, выводить информацию на дисплей 16x2 (или любой другой), собирать данные с других готовых устройств и т.д и т.п

  • Like 1
  • Thanks 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@Kitsum, огромное спасибо за помощь! Получилось, заработал экран, сделал всё согласно инструкции, расписано подробнее некуда.

Конечно, мелковат экран у 1306, надо было брать больший, типа TFT 2.4". На этом помещаются всего 2 параметра, так, чтоб было заметно. Вывел показания температуру улицы и комнаты. Возможно, добавлю кнопку, переключать экраны с дополнительными показаниями. Но уже сейчас проект, по сути, готов, будка Стивенсона есть, осталось распечатать корпус и метеостанция готова!

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пожалуйста, войдите для комментирования

Вы сможете оставить комментарий после входа



Войти сейчас

  • Похожие публикации

    • Автор: Kitsum
      Хотите помочь проекту или спонсировать новый?
      Yandex.Money PayPal.me Тема проекта
      Arduino IDE + Project + Libraries + tools: https://yadi.sk/d/jseefFB50NMhAg
    • Автор: 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 Категория Библиотеки  
    • Автор: 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 Категория Библиотеки  
    • Автор: 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(); Благодаря работе библиотеки через прерывания по таймеру, индикация будет работать даже в тех случаях, когда выполняется долгий код.
      С библиотекой идут несколько примеров.
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

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