Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Отображение даты, времени, температуры и влажности

Компоненты и расходные материалы

Arduino UNO
× 1
Датчик температуры и влажности DHT11 (4 контакта)
× 1
Maxim Integrated DS3231
× 1
Резистор 10 кОм
× 1
Графический OLED-дисплей Adafruit 128x64
× 1
Макет (общий)
× 1
Перемычки (общие)
× 15

Об этом проекте

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

Как показано ниже, необходимы несколько важных компонентов.

Ардуино Уно / Нано

Для начала нам понадобится микроконтроллер. Я использовал Arduino Uno для своего проекта, но Arduino Nano также будет иметь достаточно контактов.

DHT11

DHT11 - очень доступный цифровой датчик температуры и влажности. Он использует емкостной датчик влажности и термистор для измерения окружающего воздуха. Время считывания имеет решающее значение, так как рекомендуется снимать показания каждые 2 секунды.

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

DS3231

DS3231 - это модуль RTC, такой же, как и обычно используемый модуль DS1307. Он значительно дешевле и намного точнее своего аналога DS1307. Он содержит встроенный кварцевый генератор с температурной компенсацией (TCXO) и кристалл. Устройство имеет батарейный вход и поддерживает точное время при отключении основного питания устройства.

Графический OLED-дисплей 128x64

На OLED-экране будут отображаться наши данные. Этот размер экрана довольно компактен, а экран впечатляюще яркий. OLED-экраном Adafruit можно управлять с помощью интерфейса SPI или I2C, который можно настроить на задней части экрана. Вы также можете использовать более доступный экран (их много на eBay), но будьте осторожны при покупке, поскольку экран должен работать с файлами заголовков, которые мы собираемся использовать через библиотеки Adafruit.

Код

  • Time_Temp_Humidity_Display.ino
Time_Temp_Humidity_Display.ino Arduino
Это код для компиляции проекта. Не забудьте добавить необходимые заголовочные файлы, без этого проект работать не будет.
 // Приветствуем пользователей hackster.io! // Отображение даты, времени, температуры и влажности ///////////// //////////// Для OLED //////////////////////// # include  #include  #include  #include  // При использовании программного SPI (случай по умолчанию):# define OLED_MOSI 9 // MOSI aka SDA # define OLED_CLK 10 // CLK aka SCL # define OLED_DC 11 #define OLED_CS 12 # define OLED_RESET 13Adafruit_SSD1306 display (OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS); # if (SSD1306_LCDHEIGHT! =64) #error ("Неверная высота, пожалуйста, исправьте Adafruit_SSD!" ////////////////////////////////////////////////// //////////////////////////////////// Для DHT //////////// //////////////#includedht DHT; #define DHT11_PIN 3int DHTtimer =0; ////////////////// ////////////////////////////////////////////////// ///////////////////// Для RTC (DS3231) //////////////////////// //// От SDA к A4, SCL к A5 # определить DS3231_I2C_A DDRESS 0x68 // Преобразование обычных десятичных чисел в двоично-десятичные байты decToBcd (byte val) {return ((val / 10 * 16) + (val% 10));} // Преобразование двоичных десятичных чисел в обычные десятичные числа byte bcdToDec (byte val ) {return ((val / 16 * 10) + (val% 16));} ////////////////////////////// /////////////////////////////// void setup () {Wire.begin (); Serial.begin (9600); // установить здесь начальное время, после установки времени прокомментировать этот раздел // DS3231 секунды, минуты, часы, день, дата, месяц, год // setDS3231time (00,24,12,6,3,2,17); display.begin (SSD1306_SWITCHCAPVCC); display.clearDisplay ();} //////////////////////////// Кодирование DS3231 ///////////// ///////////// void setDS3231time (байтовая секунда, байтовая минута, байтовый час, байтовый деньOfWeek, bytedayOfMonth, байтовый месяц, байтовый год) {// устанавливает данные времени и даты для DS3231 Wire.beginTransmission ( DS3231_I2C_ADDRESS); Wire.write (0); // устанавливаем следующий ввод для начала в регистре секунд Wire.write (decToBcd (second)); // устанавливаем секунды Wire.write (decToBcd (minute)); // устанавливаем минуты Wire.write (decToBcd (hour)); // устанавливаем часы Wire.write (decToBcd (dayOfWeek)); // устанавливаем день недели (1 =воскресенье, 7 =суббота) Wire.write (decToBcd (dayOfMonth)); // устанавливаем дату (от 1 до 31) Wire.write (decToBcd (month)); // установить месяц Wire.write (decToBcd (год)); // установить год (от 0 до 99) Wire.endTransmission ();} void readDS3231time (байт * секунда, байт * минута, байт * час, байт * dayOfWeek, byte * dayOfMonth, byte * month, byte * year) {Wire. beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // устанавливаем указатель регистра DS3231 на 00h Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // запрашиваем семь байтов данных от DS3231, начиная с регистра 00h * second =bcdToDec (Wire.read () &0x7f); * минута =bcdToDec (Wire.read ()); * час =bcdToDec (Wire.read () &0x3f); * dayOfWeek =bcdToDec (Wire.read ()); * dayOfMonth =bcdToDec (Wire.read ()); * месяц =​​bcdToDec (Wire.read ()); * год =bcdToDec (Wire.read ());} void displayTime () {байтовая секунда, минута, час, день недели, день месяца, месяц, год; // получение данных из DS3231 readDS3231time (&секунда, &минута, &час, &dayOfWeek, &dayOfMonth, &month, &year); // отправляем его на серийный монитор Serial.print (час, DEC); // преобразование байтовой переменной в десятичное число при отображении Serial.print (":"); если (минута <10) {Serial.print ("0"); } Serial.print (минута, DEC); Serial.print (":"); если (второй <10) {Serial.print ("0"); } Serial.print (второй, DEC); Serial.print (""); Serial.print (dayOfMonth, DEC); Serial.print ("/"); Serial.print (месяц, DEC); Serial.print ("/"); Серийный принт (год, DEC); Serial.print ("День недели:"); ////////////////////////////////////// //////////////////////////// display.setCursor (50,0); display.print (dayOfMonth, DEC); display.print (","); display.setCursor (91,0); display.print («20»); display.print (год, декабрь); если (час <10) {display.setCursor (40,10); display.print («0»); display.print (час, дек); display.print (":"); } если (час> 9) {display.setCursor (40,10); display.print (час, дек); display.print (":"); } если (минута <10) {display.setCursor (58,10); display.print («0»); display.print (минута, дек); display.print (":"); } если (минута> 9) {display.setCursor (58,10); display.print (минута, дек); display.print (":"); } если (второй <10) {display.setCursor (75,10); display.print («0»); display.print (второй, DEC); } если (второй> 9) {display.setCursor (75,10); display.print (второй, DEC); } ///////////////////////////////////////////////// ///////////////// ////////////////////////////// НА ДЕНЬ НЕДЕЛЯ ///////////////////// switch (dayOfWeek) {case 1:Serial.println ("Sunday"); display.setTextSize (1); display.setTextColor (БЕЛЫЙ); display.setCursor (20,0); display.print («Солнце»); ломать; случай 2:Serial.println («Понедельник»); display.setTextSize (1); display.setTextColor (БЕЛЫЙ); display.setCursor (20,0); display.print («Пн»); ломать; случай 3:Serial.println («вторник»); display.setTextSize (1); display.setTextColor (БЕЛЫЙ); display.setCursor (20,0); display.print («Вт»); ломать; случай 4:Serial.println («среда»); display.setTextSize (1); display.setTextColor (БЕЛЫЙ); display.setCursor (20,0); display.print («ср»); ломать; случай 5:Serial.println («четверг»); display.setTextSize (1); display.setTextColor (БЕЛЫЙ); display.setCursor (20,0); display.print («Четверть»); ломать; случай 6:Serial.println («Пятница»); display.setTextSize (1); display.setTextColor (БЕЛЫЙ); display.setCursor (20,0); display.print («Пт»); ломать; case 7:Serial.println («суббота»); display.setTextSize (1); display.setTextColor (БЕЛЫЙ); display.setCursor (20,0); display.print («Сб»); ломать; }//////////////////////////////НА МЕСЯЦ///////////////// //// переключатель (месяц) {case 1:display.setTextSize (1); display.setTextColor (БЕЛЫЙ); display.setCursor (70,0); display.print («Янв»); ломать; случай 2:display.setTextSize (1); display.setTextColor (БЕЛЫЙ); display.setCursor (70,0); display.print («Фев»); ломать; случай 3:display.setTextSize (1); display.setTextColor (БЕЛЫЙ); display.setCursor (70,0); display.print («Мар»); ломать; случай 4:display.setTextSize (1); display.setTextColor (БЕЛЫЙ); display.setCursor (70,0); display.print («Апр»); ломать; случай 5:display.setTextSize (1); display.setTextColor (БЕЛЫЙ); display.setCursor (70,0); display.print («Май»); ломать; случай 6:display.setTextSize (1); display.setTextColor (БЕЛЫЙ); display.setCursor (70,0); display.print («июнь»); ломать; случай 7:display.setTextSize (1); display.setTextColor (БЕЛЫЙ); display.setCursor (70,0); display.print («Июл»); ломать; случай 8:display.setTextSize (1); display.setTextColor (БЕЛЫЙ); display.setCursor (70,0); display.print («Август»); ломать; случай 9:display.setTextSize (1); display.setTextColor (БЕЛЫЙ); display.setCursor (70,0); display.print ("Sep"); ломать; случай 10:display.setTextSize (1); display.setTextColor (БЕЛЫЙ); display.setCursor (70,0); display.print («Октябрь»); ломать; случай 11:display.setTextSize (1); display.setTextColor (БЕЛЫЙ); display.setCursor (70,0); display.print («ноя»); ломать; случай 12:display.setTextSize (1); display.setTextColor (БЕЛЫЙ); display.setCursor (70,0); display.print ("Dec"); ломать; } ///////////// ЧАСОВАЯ СТРЕЛКА /////////////// float x1, y1, a, b; const float pi =3,14; а =((час-15) * 30); б =(а * пи) / 180; x1 =40 + (9 * cos (b)); y1 =41 + (9 * sin (b)); display.drawLine (40,41, x1, y1, БЕЛЫЙ); ///////////// МИНУТНАЯ СТРЕЛКА ///////////////// float x1, y1, a, b; // const float pi =3.14; а =((минут-15) * 6); б =(а * пи) / 180; x1 =40 + (17 * cos (b)); y1 =41 + (17 * sin (b)); display.drawLine (40,41, x1, y1, БЕЛЫЙ); ///////////// Б / У /////////////// // float x1, y1, a, b; а =((второй-15) * 6); б =(а * пи) / 180; x1 =40 + (19 * cos (b)); y1 =41 + (19 * sin (b)); display.drawLine (40,41, x1, y1, БЕЛЫЙ); //////////////// ЧАСТИ АНАЛОГОВЫХ ЧАСОВ, КОТОРЫЕ НЕ БУДУТ ПЕРЕМЕЩАТЬСЯ //////////////// display.drawCircle (40, 41, 22, БЕЛЫЙ); display.drawCircle (40, 41, 1, БЕЛЫЙ); display.drawLine (40, 20, 40, 25, БЕЛЫЙ); //12display.drawLine(40, 63, 40, 58, БЕЛЫЙ); //6display.drawLine(62, 41, 57, 41, БЕЛЫЙ); //3display.drawLine(19, 41, 24, 41, БЕЛЫЙ); //9display.drawLine(50, 24, 47, 28, БЕЛЫЙ); //1display.drawLine(57, 31, 53, 34, БЕЛЫЙ); //2display.drawLine(60, 51, 54, 48, БЕЛЫЙ); //4display.drawLine(51, 58, 48, 54, БЕЛЫЙ); //5display.drawLine(29, 58, 32, 54, БЕЛЫЙ); //7display.drawLine(21, 51, 25, 48, БЕЛЫЙ); //8display.drawLine(22, 31, 27, 33, БЕЛЫЙ); //10display.drawLine(30, 23, 32, 28, БЕЛЫЙ); // 11} void ReadTempAndHum () {int chk =DHT.read11 (DHT11_PIN); display.setTextSize (1); display.setTextColor (БЕЛЫЙ); display.setCursor (70,45); display.print ("Температура:"); дисплей.печать (DHT.температура, 0); display.print («C»); display.setCursor (70,56); display.print ("Гуд:"); дисплей.принт (DHT.humidity, 0); display.print ("%"); Serial.print ("Humidity:"); Serial.print (DHT.humidity, 1); Serial.print ("%"); Serial.print ("| Температура:"); Serial.print (DHT.temperature, 1); Serial.println ("C");} void loop () {displayTime (); // отображаем данные часов реального времени на последовательном мониторе, DHTtimer =DHTtimer + 1; // Чтобы гарантировать, что DHT читается только каждые 2 секунды, мы делаем счет в течение 2 секунд if (DHTtimer> 1) {display.fillRect (70, 45, 128, 64, BLACK); ReadTempAndHum (); DHTtimer =0; } задержка (1000); display.display (); // Часть экрана, которая показывает время и дату, очищается display.fillRect (0, 0, 64, 64, ЧЕРНЫЙ); display.fillRect (0, 0, 128, 20, ЧЕРНЫЙ);} 

Изготовленные на заказ детали и корпуса

adafruit_ssd1306-master_KOASsXZpW2.zip adafruit-gfx-library-master_2IU6g1UpF6.zip dht_library_Xgke1ZhPls.zip dht-sensor-library-master_Al4SeQRvaS.zip arduinortclibrary-master_hKLoSjCilY.zip

Схема

Примечание:мне не удалось найти подходящий OLED-экран на Fritzing. Если вам нужно уточнить расположение выводов OLED, проверьте комментарии к коду. breadboard_diagram_QvhPKCpIo5.fzz Примечание:я не смог найти правильный OLED-экран на Fritzing. Если вам нужно уточнить расположение выводов OLED, проверьте комментарии к коду. schematic_XKU0jQoWbx.fzz

Производственный процесс

  1. Как получить текущую дату и время в Python?
  2. Сетевой монитор температуры и влажности Raspberry Pi
  3. Датчик температуры Python и Raspberry Pi
  4. Простая температура и влажность на Raspberry Pi
  5. Лаборатория «Метеостанция»
  6. Датчик температуры и освещенности Raspberry Pi
  7. Как проверить и откалибровать датчик влажности
  8. Java — Дата и время
  9. Дата и время С++
  10. Python — Дата и время