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

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

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

Часы на WeMos D1 с датчиком температуры DS18B20

 

В проекте использовал плату RobotDyn D1 R2, практически её аналог – плата WeMos D1. Датчик температуры DS18B20 взял в виде модуля. Если у вас отдельный датчик, то между плюсом питания и шиной данных (средний вывод датчика) надо впаять резистор 4,7 кОм. На модуле этот резистор уже впаян. Датчик DS18B20 можно подключить линией длиной до 10 м. Датчик работает при малых токах и напряжениях, поэтому надо обеспечить хорошие контакты и использовать медные провода достаточного сечения для уменьшения сопротивления линии. При использоывании кабеля "витая пара" желательно выбрать кабель с витыми парами из медных многожильных проводов. Под каждую шину датчика можно взять витую пару и запараллелить обе жилы для снижения общего сопротивления шины. Нежелательно использовать обычный кабель с витыми парами из одножильных омеднённых проводиков.

  

В качестве индикатора использован 4-разрядный 7-сегментный дисплей TM1637.

Подключение DS18B20 и TM1637

Параметр RobotDyn D1 R2 WeMos D1 R1
DS18B20 GPIO 0 пин D3 пин D8
TM1637 CLK GPIO 4 пин D2 пин D4
TM1637 DIO GPIO 5 пин D1 пин D3
Выбор платы
в Arduino IDE
LOLIN(WEMOS) D1 R2 & mini LOLIN(WeMos) D1 R1

Среда Arduino IDE должна быть настроена для плат типа ESP8266. Как настроить, описано, например, в [5].
В проекте можно использовать плату RobotDyn D1 R2 или WeMos D1 R1. В таблице показано, к каким контактам на платах подключаются шины DATA DS18B20, CLK и DIO TM1637. Плюс питания DS18B20 подключается к +5 V на плате, VCC TM1637 подключается к +3.3 V на плате. Контакты GND подключены к соответствующим контактам на плате. Также указано, какую плату надо выбрать в менеджере плат среды Arduino IDE для каждого варианта. Для этого в меню выберите Инструменты -> Плата -> Менеджер плат и из списка выберите плату LOLIN(WEMOS) D1 R2 & mini или LOLIN(WeMos) D1 R1:

Также в среде Arduino IDE надо подключить библиотеки для датчика DS18B20. Для этого в меню пройдите Скетч -> Подключить библиотеку -> Управлять библиотеками... В окне поиска Менеджера библиотек введите onewire и нажмите Enter. Через пару секунд в окне появится эта библиотека или библиотеки, в названиях которых присутствует поисковое слово. Прокрутите окно вверх-вниз так, чтобы появилась искомая библиотека. Нажмите на кнопку Установка. У меня эта библиотека уже установлена, поэтому кнопка Установка неактивна. После установки появится надпись INSTALLED.

Аналогично подключается библиотека DallasTemperature.

Показания времени загружаются с одного из NTP серверов в интернете. Подробно об этом иожно прочитать в [8]. Русский перевод см. в [2]. Для этого придется подключить библиотеку NTPClient. В окне поиска Менеджера библиотек введите NTP и нажмите Enter.

Для скетча также понадобятся библиотеки ESP8266WiFi.h и WiFiUdp.h. Библиотеку ESP8266WiFi.h можно скачать с martyncurrey.com/download/esp8266wifi-library/. В скачанном списке библиотек есть WiFiUdp.h. Скачанный ZIP-архив библиотеки ESP8266wifi.zip надо установить в среде Arduino IDE. Идем Скетч -> Подключить библиотеку -> Добавить .ZIP библиотеку...

Дисплею TM1637 также потребуется подключить библиотеку. В окне поиска Менеджера библиотек наберите TM1637 и нажмите Enter. Для TM1637 предлагается несколько библиотек на выбор. Выберите TM1637 by Avishay Orpaz и нажмите Установка (Install).

Скетч WeMos_DS18B20_ntp-1

#include <Wire.h>
#include <ESP8266WiFi.h>                                // Подключаем библиотеку ESP8266WiFi
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <TM1637Display.h>
#define CLK 4                               // GPIO 4
#define DIO 5                               // GPIO 5

int temperature_C;

const int SensorDataPin = 0;                // GPIO 0
OneWire oneWire(SensorDataPin);
DallasTemperature sensors(&oneWire);

const long utcOffsetInSeconds = 32400;     // time zone +9 (Chita):  9*60*60=32400

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

// Определение NTP-клиента для получения времени
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);

const char* ssid = "********";            // Название Вашей WiFi сети
const char* password = "*************";     // Пароль для Вашей WiFi сети

const uint8_t celsius[] = {
  SEG_A | SEG_B | SEG_F | SEG_G  // Circle (градус)
};

const uint8_t minus[] = {
  SEG_G                             // minus
};

// Create display object of type TM1637Display
TM1637Display display = TM1637Display(CLK, DIO);

void setup() {
  Serial.begin(9600);

  Wire.begin();
  delay(1000);

  sensors.begin();

  Serial.print("Connecting to ");                       // Отправка в Serial port
  Serial.println(ssid);                                 // Отправка в Serial port
  WiFi.begin(ssid, password);                           // Подключение к WiFi Сети
  while (WiFi.status() != WL_CONNECTED) {               // Проверка подключения к WiFi сети
    delay(500);                                         // Пауза
    Serial.print(".");                                  // Отправка в Serial port
  }

  Serial.println("");                                   // Отправка в Serial port
  Serial.println("WiFi connected.");                    // Отправка в Serial port
  Serial.print("IP address: ");                         // Отправка в Serial port
  Serial.println(WiFi.localIP());                       // Отправка в Serial port

  timeClient.begin();

  // Set the display brightness (0-7)
  display.setBrightness(5);
  // Clear the display
  display.clear();

}

void loop() {

  timeClient.update();

  Serial.print(daysOfTheWeek[timeClient.getDay()]);     // в монитор порта выводим день недели (англ)
  Serial.print(", ");
  Serial.print(timeClient.getHours());                  // в монитор порта выводим часы

  Serial.print(":");
  Serial.print(timeClient.getMinutes());                // в монитор порта выводим минуты

  Serial.print(":");
  Serial.println(timeClient.getSeconds());              // в монитор порта выводим секунды
  //Serial.println(timeClient.getFormattedTime());

  sensors.requestTemperatures();
  float temperature_Celsius = sensors.getTempCByIndex(0);
  float temperature_Fahrenheit = sensors.getTempFByIndex(0);

  // выводим в порт температуру в градусах Цельсия и Фаренгейта

  Serial.print("Temperature: ");
  Serial.print(temperature_Celsius);
  Serial.println(" ºC");
  Serial.print("Temperature: ");
  Serial.print(temperature_Fahrenheit);
  Serial.println(" ºF");
  Serial.println("");

  display.clear();                                      // дисплей TM1637
  temperature_C = trunc (sensors.getTempCByIndex(0));   // в показаниях температуры берем целое число градусов

  // Display the temperature in celsius format
  display.showNumberDec(temperature_C, false, 2, 1);  // выводим целое число градусов
  display.setSegments(celsius, 1, 3);                 // выводим знак градуса
  if (temperature_C < -9) {                              // если температура < -9, выводим минус в первой позиции
    display.setSegments(minus, 1, 0);
  }
  delay (5000);

  display.clear();
  // Create time format to display
  int displaytime = (timeClient.getHours() * 100) + timeClient.getMinutes();    // готовим числовой формат для вывода времени

  // Display the current time in 24 hour format with leading zeros and a center colon enabled

  display.showNumberDecEx(displaytime, 0b11100000, true);   // выводим на дисплей время с лидирующими нулями и двоеточием

  delay (5000);

}

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

Для отображения местного времени вам понадобится рассчитать и прописать в скетче константу long utcOffsetInSeconds для вашей часовой зоны (time zone). У меня часовая зона +9 от времени UTC (Чита, Якутск). Константа long utcOffsetInSeconds для Читы получится 9*60*60=32400. Подробно об этом иожно прочитать в [8]. Русский перевод см. в [2].

 

Видимо в библиотеке TM1637Display.h есть ошибка. При выводе отрицательных значений числа -1...-9 выводятся нормально со знаком минус, а числа , меньшие -9, т.е. -10, -11, -12  и т.д. выводятся без минуса. Для устранения этого при температурах -10°, -11°, -12° и ниже в первой позиции перед числом принудительно выводится знак минус.

 

В Каталоге файлов сайта можно скачать скетч и архив библиотеки ESP8266wifi.zip. Также добавлен вариант скетча с мигающим двоеточием при выводе показаний времени.

Плата RobotDyn D1 R2 имеет IPX разъем для подключения внешней WiFi антенны. Если у вас слабый сигнал WiFi, то вам лучше использовать эту плату вместе с внешней антенной. 

Использованные источники

1. https://lastminuteengineers.com/tm1637-arduino-tutorial/
2. https://radioprog.ru/post/910
3. https://microcontrollerslab.com/ds18b20-esp8266-nodemcu-single-multiple-display-readings-oled/
4. https://espsmart.ru/blog/19-podkljuchenie-datchika-temperatury-ds18b20-k-esp8266.html?ysclid=lpyqwbc5xx637989549
5. https://arduinomaster.ru/datchiki-arduino/esp8266-wemos-d1-mini-raspinovka/?ysclid=lpyu3phi2o9323124984
6. https://radio.obninskiy.net/blog/esp8286/19.html?ysclid=lpyrcdukpb390457138
7. https://alexgyver.ru/lessons/esp8266/?ysclid=lpyrbmnw90758388197
8. https://lastminuteengineers.com/esp8266-ntp-server-date-time-tutorial/
9. http://zgo.narod.ru/publ/arduino_with_bme280_sensor_and_time_display/1-1-0-132

Категория: Мои статьи | Добавил: zgo (11.12.2023)
Просмотров: 355 | Теги: DS18B20, часы, WeMos, NTP, sensor temperature, датчик температуры, clock, Arduino WiFi | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Поиск
Друзья сайта
  • Создать сайт
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Все проекты компании
  • Сайт завода zgo.ucoz.ru
  • Забайкальский край
    Дарасун
    Яндекс.Погода


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

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

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

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



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



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