Пятница, 22.11.2024
Завод горного оборудования
Меню сайта
Google_Translate
Категории раздела
Мои статьи [125]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Рейтинг@Mail.ru

Яндекс.Метрика
Главная » Статьи » Мои статьи

NodeMCU v3 (ESP8266) - вывод показаний температуры и времени на веб-страницу

В проекте [2] на веб-страницу выводятся показания температуры с датчика DS18B20. Показания температуры меняются медленно. Непонятно, работает система или нет, поэтому дополнил ее выводом текущего времени. Правда, выводится UTC время (всемирное координированное время). Чтобы узнать местное время, надо учесть поправку на часовой пояс (временнУю зону). У меня поправка равна +9 (временная зона Якутска).
Фрагмент скетча для определения времени взял из примера Arduino-библиотеки ESP_RTC.zip [4]. Авторы Michael Margolis, Tom Igoe and Ivan Grokhotkov. Программа ищет NTP сервер точного времени, посылает запрос. По полученным данным вычисляется время UTC и выводится на веб-страницу вместе с показаниями температуры. Для обновления показаний просто обновите (перезагрузите) веб-страницу.
Использовалась среда Arduino IDE 1.8.5 на Windows 10. Для платы NodeMCU v3 скачайте и установите драйвер CH340G. Поиск выдает для скачивания архив ch341ser_w.zip. Распакуйте его, в нем всего один файл ch341ser.exe. Запустите его от имени администратора. После запуска появится окно. В окне нажмите кнопку INSTALL. Подробно процесс установки описан в [5]. В результате всех манипуляций у вас в списке появится плата NodeMCU 1.0 (ESP-12E Module).

Соберите схему, сопротивление резистора 4.7 кОм. Так как Wi-Fi адаптер модуля потребляет довольно большой ток, используйте достаточно мощный блок питания. У меня питается от USB хаба с внешним блоком питания на 2 А.

Скетч time_ds18b20_web

/*********
  Руи Сантос (Rui Santos)
  Более подробно о проекте на: http://randomnerdtutorials.com
*********/

// подключаем библиотеку «ESP8266WiFi»:
#include <ESP8266WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <WiFiUdp.h>

// вписываем здесь SSID и пароль для вашей WiFi-сети:
const char* ssid = "Xiaomi"; // введите название вашей Wi-Fi сети
const char* password = "12345abcdefgh"; // введите пароль Wi-Fi сети
unsigned int localPort = 2390; // local port to listen for UDP packets

unsigned long epoch = 0;

/* Don't hardwire the IP address or we won't get the benefits of the pool.
    Lookup the IP address for the host name instead */
IPAddress timeServerIP; // time.nist.gov NTP server address
const char* ntpServerName = "pool.ntp.org";

const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message

const int timeZone = 9; // GMT+9 for Yakutsk Time
const long timeZoneOffset = timeZone * 3600;

byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets

// A UDP instance to let us send and receive packets over UDP
WiFiUDP udp;


// контакт для передачи данных подключен к D1 на ESP8266 12-E (GPIO5):
#define ONE_WIRE_BUS 5

// создаем экземпляр класса oneWire; с его помощью
// можно коммуницировать с любыми девайсами, работающими
// через интерфейс 1-Wire, а не только с температурными датчиками
// от компании Maxim/Dallas:
OneWire oneWire(ONE_WIRE_BUS);

// передаем объект oneWire объекту DS18B20:
DallasTemperature DS18B20(&oneWire);
char temperatureCString[6];
char temperatureFString[6];

// веб-сервер на порте 80:
WiFiServer server(80);

// блок setup() запускается только один раз – при загрузке:
void setup() {
  // инициализируем последовательный порт (для отладочных целей):

  Serial.begin(115200);
  delay(10);

  DS18B20.begin(); // по умолчанию разрешение датчика – 9-битное;
  // если у вас какие-то проблемы, его имеет смысл
  // поднять до 12 бит; если увеличить задержку,
  // это даст датчику больше времени на обработку
  // температурных данных

  // подключаемся к WiFi-сети:
  Serial.println();
  Serial.print("Connecting to "); // "Подключаемся к "
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected"); // "Подключение к WiFi выполнено"

  // запускаем веб-сервер:
  server.begin();
  Serial.println("Web server running. Waiting for the ESP IP...");
  // "Веб-сервер запущен. Ожидание IP-адреса ESP..."
  delay(10000);

  // печатаем IP-адрес ESP:
  Serial.println(WiFi.localIP());

  Serial.println("Starting UDP");
  udp.begin(localPort);
  Serial.print("Local port: ");
  Serial.println(udp.localPort());
}

void getTemperature() {
  float tempC;
  float tempF;
  do {
    DS18B20.requestTemperatures();
    tempC = DS18B20.getTempCByIndex(0);
    dtostrf(tempC, 2, 2, temperatureCString);
    tempF = DS18B20.getTempFByIndex(0);
    dtostrf(tempF, 3, 2, temperatureFString);
    delay(100);
  } while (tempC == 85.0 || tempC == (-127.0));
}

// блок loop() будет запускаться снова и снова:
void loop() {

  //get a random server from the pool
  WiFi.hostByName(ntpServerName, timeServerIP);

  sendNTPpacket(timeServerIP); // send an NTP packet to a time server
  // wait to see if a reply is available
  //  delay(1000);
  unsigned long timeout = millis() + 1000;
  while ((udp.available() < NTP_PACKET_SIZE) && (millis() < timeout)) {}
  int cb = udp.parsePacket();
  if (! cb) {
    Serial.println("no packet yet");
  } else {
    Serial.print("packet received, length=");
    Serial.println(cb);
    // We've received a packet, read the data from it
    udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer

    //the timestamp starts at byte 40 of the received packet and is four bytes,
    // or two words, long. First, esxtract the two words:

    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
    // combine the four bytes (two words) into a long integer
    // this is NTP time (seconds since Jan 1 1900):
    unsigned long secsSince1900 = highWord << 16 | lowWord;

    // now convert NTP time into everyday time:
    // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
    const unsigned long seventyYears = 2208988800UL;
    // subtract seventy years:
    // unsigned long epoch = secsSince1900 - seventyYears;
    epoch = secsSince1900 - seventyYears;
  }
  // начинаем прослушку входящих клиентов:
  WiFiClient client = server.available();

  if (client) {
    Serial.println("New client");  //  "Новый клиент"
    // создаем переменную типа «boolean»,
    // чтобы определить конец HTTP-запроса:
    boolean blank_line = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        if (c == '\n' && blank_line) {
          getTemperature();
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();
          // веб-страница с данными о температуре:
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          client.println("<head></head><body><h1>ESP8266 - Temperature</h1>");
          client.print("The UTC time is ");
          client.println((epoch % 86400L) / 3600);           //  часы
          client.println(" : ");
          if (((epoch % 3600) / 60) < 10) {
            // In the first 10 minutes of each hour, we'll want a leading '0'
            client.print('0');
          }
          client.println((epoch  % 3600) / 60);                //  минуты
          client.println(" : ");
          if ((epoch % 60) < 10) {
            // In the first 10 seconds of each minute, we'll want a leading '0'
            client.print('0');
          }
          client.println(epoch % 60);                             //  секунды
          client.print("<br><b> Chita +9 </b>");

          client.println("<h3>Temperature in Celsius: ");
          client.println(temperatureCString);
          client.println("*C</h3></body></html>");
          break;
        }
        if (c == '\n') {
          // если обнаружен переход на новую строку:
          blank_line = true;
        }
        else if (c != '\r') {
          // если в текущей строчке найден символ:
          blank_line = false;
        }
      }
    }
    // закрываем соединение с клиентом:
    delay(1);
    client.stop();
    Serial.println("Client disconnected.");
    //  "Клиент отключен."
  }
}

// send an NTP request to the time server at the given address
unsigned long sendNTPpacket(IPAddress& address) {
  Serial.println("sending NTP packet...");
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12] = 49;
  packetBuffer[13] = 0x4E;
  packetBuffer[14] = 49;
  packetBuffer[15] = 52;

  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:
  udp.beginPacket(address, 123); //NTP requests are to port 123
  udp.write(packetBuffer, NTP_PACKET_SIZE);
  udp.endPacket();
}

После загрузки пропишите в скетче имя и пароль вашей Wi-Fi сети. В скетче используются библиотеки OneWire.h и DallasTemperature.h, как их импортировать, описано в [1]. Можете использовать готовые библиотеки из архива со скетчем.
Импортируйте библиотеки OneWire и DallasTemperature. В меню пройдите СкетчПодключить библиотекуДобавить .ZIP библиотеку... и в окне выберите zip-архив библиотеки.
Скомпилируйте и запустите скетч. При подключении на монитор порта будет выдан IP адрес соединения.

На компьютере локальной сети откройте браузер и введите в адресной строке этот адрес. Вы должны увидеть примерно следующее:

Скачать скетч и библиотеки.

Чтобы просматривать веб-страницу через интернет, в Wi-Fi роутере надо настроить для модуля статический IP адрес и сделать проброс портов (port forwarding). В настройках port forwarding укажите протокол TCP и порт 80. О настройках можно прочитать в статье Как получить доступ по интернету к датчикам в квартире.
При настройке понадобится MAC адрес модуля, обычно его можно увидеть в настройках Wi-Fi роутера в списке устройств. Также MAC адрес (физический адрес) можно узнать, если в командной строке Windows дать команду arp -a <IP_адрес_модуля>.
Но тут есть одна закавыка. DNS сервис предлагает установить утилиту, которая периодически посылает на сервис текущий IP адрес. Когда провайдер выдаст вашему роутеру другой IP адрес, утилита сообщит новый IP адрес на DNS сервис. Сервис заменит устаревший IP адрес на текущий на DNS серверах. Вашему домену (имени сайта) будет соответствовать уже новый IP адрес и ваше устройство снова будет доступно в интернете. На NodeMCU нет возможности установить такую утилиту, но если у вас в сети есть компьютер Windows или Linux (Raspberry Pi), то вы можете установить эту утилиту на один из этих компьютеров. Он должен быть практически постоянно включен. Проще всего использовать Raspberry Pi или подобный компьютер. Как настроить доступ из интернета на Raspberry Pi, также написано в статье Как получить доступ по интернету к датчикам в квартире.

Статья обновлена 20.09.2021

Использованные ресурсы
1. https://randomnerdtutorials.com/esp8266-ds18b20-temperature-sensor-web-server-with-arduino-ide/
2. http://wikihandbk.com/wiki/ESP8266:Примеры/Отображение_температуры_в_браузере_с_помощью_чипа_ESP8266_и_датчика_DS18B20
3. https://www.youtube.com/watch?v=c9Uyklx5tf8
4. https://drive.google.com/file/d/0B7YhCK2ZNsYYbmlRdmtwdndhb2c/view
5. http://arduinonsk.ru/?id=127:arduino-ide-esp-install

Категория: Мои статьи | Добавил: zgo (19.05.2018)
Просмотров: 7688 | Комментарии: 22 | Теги: NTP, time, монитор, Время, temperature, NodeMCU v3, ESP8266, температура, DS18B20, UTC | Рейтинг: 0.0/0
Всего комментариев: 5
5 Denvergeoli  
0
Пользуюсь VPS хостингом от HIDEHOST уже несколько месяцев, и могу с уверенностью сказать, что это лучший выбор для моего онлайн-проекта. Скорость загрузки страниц, стабильность работы сервера и качество поддержки - всё на высшем уровне. Благодаря HIDEHOST мой сайт всегда доступен и защищен от любых атак. Рекомендую всем, кто ищет надежный хостинг! - <a href=https://billing.hidehost.net/pl.php?832>HIDEHOST</a>

4 JosephEdith  
0
https://ito-kaliningrad.ru/

3 warteeeesa  
0
https://famous-tiktok-profile.club/how-to-be-famous-on-tiktok/

musically hack 2019
tiktok hack 2019
The in reality that the 2 apps share a mother or father pty implies that each corporations secure been incredibly quiet up administration obstruction, and the truly that they hoard Tik Tok Views Hack Apk and advance of consumer communication in, Joint States of America, Singapore, Japan or to China.” This text vulnerability is far downwards worrisome and may keep at bay users of the app.

2 rixtero  
0
hello. i am wertekson

1 rixtero  
0
hello. i am wertekson

Имя *:
Email *:
Код *:
Поиск
Друзья сайта
  • Создать сайт
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Все проекты компании
  • Сайт завода zgo.ucoz.ru
  • Забайкальский край
    Дарасун
    Яндекс.Погода


    Хостинг Ucoz опять навязал видеорекламу, но обещает - "мы настроили систему так, чтобы в сутки на уникального посетителя приходилось не более двух показов."
    Совет, как не смотреть видеорекламу.

    Или используйте Uran - браузер от Ucoz без рекламы Скачать

    или подключите к браузеру блокировщик рекламы, например, Adblock Plus или uBlock Origin

    Универсальный декодер кириллицы



    Защита, контроль, управление.



    DONATE (поддержи автора)
    Все статьи авторские, при использовании прошу ссылаться на сайт
    Copyright Дарасунский завод горного оборудования © 2004 - 2024
    Бесплатный конструктор сайтов - uCoz