В проекте использовал плату 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
|