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

Местная метеостанция

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

Arduino Nano R3
× 1
Seeed Grove - датчик барометра (BMP280)
× 1
Датчик температуры и влажности DHT11 (4 контакта)
× 1
ElectroPeak 0.96 "OLED-дисплей 64x128"
× 1
УФ-датчик GUVA-S12SD
× 1
DS3231 RTC
× 1

Необходимые инструменты и машины

Паяльник (универсальный)
Проволока для припоя, без свинца
3D-принтер (общий)

Приложения и онлайн-сервисы

IDE Arduino
Autodesk Fusion 360

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

Давно хотел сделать метеостанцию ​​без интернета. Замечательно измерять погодные данные в вашем окружении и при необходимости просматривать их. Итак, я делаю классную местную метеостанцию, которая может измерять давление окружающего воздуха, температуру, влажность и дневной УФ-индекс (если вы поместите ее возле окна). Подождите, у него еще есть! 😉 он также имеет экран часов для отображения времени, даты и дня недели.

В этом уроке я покажу вам, как сделать эту станцию ​​для прохладной погоды за эти шаги.

Шаг 1. Построение ограждения

Я использую Autodesk fusion 360 создать корпус и распечатать его зеленым PLA. Ему нужны опоры, и я распечатываю его с заполнением 20% и скоростью 70 мм / с на моем Ender 3. Вы найдете файл STL для корпуса вместе с этим проектом.

Шаг 2:BMP280

BMP280 - это датчик атмосферного давления и температуры, который использует протокол I2C или SPI для связи с Arduino. Здесь я использую SPI. Чтобы использовать SPI, подключите-

  • CS - D10
  • SDA к D11
  • SDO для D12
  • SCK до D13

В части кода, чтобы использовать этот датчик, нам нужна библиотека. в первую очередь включаю библиотеку в код #include . вы можете скачать библиотеку отсюда.

Затем я определяю вывод SPI для датчика. В функции настройки я инициализирую датчик BMP, а в функции цикла я считываю данные давления и температуры с помощью bmp.readPressure () и bmp.readTemperature () команда. Я делю значение давления на 100, чтобы измерить давление в единицах гПа. Для измерения высоты я использую bmp.readAltitude (1005.47) . команда. Здесь вам нужно изменить значение (1005.47) в соответствии со средним давлением в вашем регионе.

Шаг 3. DS3231 RTC

Эта метеостанция также имеет экран времени, который может показывать текущее время, дату и день слабого. Для этой цели я использую модуль DS231 RTC, который использует для связи протокол I2C. поэтому, чтобы использовать это, подключите-

  • От SCL до A5
  • SDA в A4

прежде всего, вы должны установить время и дату на RTC с помощью DS3231_set.ino программа из библиотеки Example.

В основную программу я включаю библиотеку #include и считайте данные времени согласно инструкции из библиотеки. здесь я использую пример из библиотеки как ссылку на код. Я создал кейс на каждый день недели, чтобы узнать текущий день.

Шаг 4:DHT11

Я использую этот датчик для измерения влажности. Для этого подключаю его данные к выходу в Arduino D2 . И в программу я включаю библиотеку DHT #include затем в настройке я инициализирую датчик и в цикле считываю значение влажности с помощью dht.readHumidity () команда.

Шаг 5:УФ-датчик GUVA-S12SD

GUVA-S12SD представляет собой фотодиод на основе нитрида галлия типа Шоттки. Он имеет типичную длину волны обнаружения УФ-излучения 240–370 нм (которая покрывает УФ-В и большую часть УФ-спектра А). Он выдает откалиброванное аналоговое напряжение, которое зависит от интенсивности УФ-излучения. Итак, мы можем считывать аналоговое значение через АЦП Arduino.

в функции цикла, я аналог считываю значение датчика и вычисляю УФ-индекс

  float sensorValue =analogRead (A0); 
float sensorVoltage =sensorValue / 1024 * 5,0;
int UV_index =sensorVoltage / 0,1;

Шаг 6:OLED-дисплей

Я использую OLED-дисплей размером 0,96 дюйма 128 * 64 для этого проекта, он использует протокол I2C, поэтому я подключаю его к Arduino следующим образом:

  • SCK до A5
  • SDA в A4

В программу сначала включаю библиотеки Adafruit_SSD1306 и Adafruit_GFX

  #include  
#include

затем я создаю переменную отображения, а также добавляю растровое изображение для отображения некоторых изображений. В настройке инициализирую дисплей. затем в цикле я отображаю все данные с помощью display.print () функция. Я отображаю данные на четырех страницах:время, давление, температура и влажность, а также UV_index. между каждой страницей есть 5-секундная задержка.

Видеоклип

Код

  • Код местной метеостанции
Код местной метеостанции Arduino
 #include  #include  #include  #include  #include  #include  #include  #include  #include  // # include  #define SCREEN_WIDTH 128 #dedefine SCREEN_WIDTH 128 #dedefine SCREEN_THREIGHT 64ES SCREEN_THREIGHT 64 #dedefine SCREEN_THREIGHT 64 #define , OLED_RESET); #define BMP_SCK (13) #define BMP_MISO (12) #define BMP_MOSI (11) #define BMP_CS (10) Часы DS3231; bool век =false; bool h12Flag; bool pmFlag; Adafruit_BMP_MOSI, (BMP_MOSI, (BMP_MOSI, , BMP_SCK); # определить DHTPIN 2 # определить DHTTYPE DHT11DHT dht (DHTPIN, DHTTYPE); const unsigned char PROGMEM frame0 [] ={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x01, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x7F, 0x81, 0xFE, 0x00, 0x00, 0xFC, 0x00, 0x3F, 0x 0xF0, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x18, 0x07, 0xC0, 0x07, 0x86, 0 x18, 0x61, 0xE0, 0x0F, 0x02, 0x00, 0x40, 0xF0, 0x0F, 0x02, 0x00, 0x40, 0xF0, 0x1E, 0x00, 0x00, 0x00, 0x78, 0x1C, 0x40, 0x00, 0x38, 0x02 0x00, 0x06, 0x3C, 0x3C, 0x01, 0x80, 0x00, 0x3C, 0x38, 0x00, 0x80, 0x00, 0x1C, 0x38, 0x00, 0xC0, 0x00, 0x1C, 0x78, 0x00, 0xE0, 0x00, 0x1E 0xF0, 0x03, 0x9E, 0x79, 0xC0, 0x7C, 0x03, 0x9E, 0x78, 0x00, 0x7E, 0x00, 0x1E, 0x38, 0x00, 0x7E, 0x00, 0x1C, 0x38, 0xFC, 0xFFx, 0x3, 0x3F, 0x3F, 0x7E, 0x3F, 0x3C, 0x3C, 0xFE, 0x7E, 0x7F, 0x3C, 0x1C, 0x7E, 0x18, 0x7E, 0x38, 0x1E, 0x3F, 0x00, 0xFC, 0x78, 0x0F, 0x3F, 0xC3, 0xFC 0x0F0, 0xF0 0xFF, 0xF8, 0xF0, 0x07, 0x87, 0xFF, 0xE1, 0xE0, 0x03, 0xC1, 0xFF, 0x83, 0xC0, 0x03, 0xF0, 0x3C, 0x0F, 0xC0, 0x01, 0xFCx3, 0x00x, 0x00, 0x00 0x81, 0xFE, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; const unsigned char PROGMEM frame1 [] ={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x00, 0x00, 0x01, 0x00, 0x9D, 0x80, 0x00, 0x0 0xB4, 0xE0, 0x00, 0x06, 0x80, 0xA6, 0x80, 0x00, 0x04, 0xC0, 0xA6, 0xE0, 0x00, 0x0C, 0x40, 0xA6, 0xE0, 0x00, 0x08, 0x60, 0x80, 0x08, 0x80, 0x08 0xA6, 0xE0, 0x00, 0x08, 0x60, 0xA6, 0x80, 0x00, 0x0E, 0xC0, 0xA6, 0xE0, 0x00, 0x03, 0x80, 0xA6, 0x80, 0x00, 0x00, 0x10, 0x0x00, 0x00, 0xC00 0xA6, 0xE0, 0x00, 0x00, 0x38, 0xA6, 0x80, 0x00, 0x00, 0x6C, 0xA6, 0xE0, 0x00, 0x00, 0x44, 0xA6, 0x80, 0x00, 0x00, 0x6C, 0xA6, 0x00, 0xE 0xA6, 0x80, 0x00, 0x00, 0x00, 0xA6, 0x80, 0x00, 0x00, 0x00, 0xA4, 0xE0, 0x00, 0x00, 0x00, 0xA6, 0x80, 0x00, 0x00, 0x40, 0xA6, 0x00, 0x00, 0xE0 0xA6, 0x80, 0x00, 0x01, 0xA0, 0xA6, 0xE0, 0x00, 0x01, 0x30, 0xA6, 0xE0, 0x00, 0x03, 0x10, 0xA6, 0x80, 0x00, 0x02, 0x18, 0xA6, 0x00, 0xE 0xA6, 0x80, 0x00, 0x06, 0x08, 0xA6, 0x80, 0x00, 0x02, 0x19, 0xA6, 0xC0, 0x00, 0x03, 0xF3, 0x26, 0x60 , 0x00, 0x00, 0xC6, 0x26, 0x30, 0x00, 0x00, 0x0C, 0xE3, 0x10, 0x00, 0x00, 0x09, 0x80, 0x98, 0x00, 0x00, 0x19, 0x00, 0xC8, 0x00, 0x00, 0x13 , 0x00, 0x00, 0x12, 0x00, 0x6C, 0x00, 0x00, 0x12, 0x00, 0x6C, 0x00, 0x00, 0x12, 0x00, 0x6C, 0x00, 0x00, 0x1B, 0x00, 0x4C, 0x00, 0x00, 0x80, 0x09, 0x09 , 0x00, 0x00, 0x0C, 0xC1, 0x98, 0x00, 0x00, 0x04, 0x7F, 0x30, 0x00, 0x00, 0x06, 0x1C, 0x60, 0x00, 0x00, 0x03, 0x81, 0xC0, 0xFF00, 0x00x, 0x00x , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; const unsigned char PROGMEM frame2 [] ={0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF , 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF , 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF , 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFFFF, 0xFF, 0xFF, 0xFF, 0xFFFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0 xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80}; установка void () {Serial.begin (57600); если (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {Serial.println (F («SSD1306 failed»)); } Wire.begin (); dht.begin (); если (! bmp.begin ()) {Serial.println (F ("Problem.bmp")); while (1) задержка (10); } display.clearDisplay (); display.setTextColor (БЕЛЫЙ); display.setTextSize (1); display.setCursor (0, 9); display.setFont (&FreeSans9pt7b); display.println ("**** МЕСТНОЕ ****"); display.setCursor (0, 38); display.setFont (&FreeMonoBoldOblique12pt7b); display.println ("вода"); display.setCursor (27, 58); display.println («Станция»); display.display (); задержка (2000); bmp.setSampling (Adafruit_BMP280 ::MODE_NORMAL, / * Режим работы. * / Adafruit_BMP280 ::SAMPLING_X2, / * Передискретизация температуры * / Adafruit_BMP280 ::SAMPLING_X16, / * Передискретизация давления * / Adafruit_BMP280 ::FILTER_X Adafruit_BMP280 ::STANDBY_MS_500); /* Время ожидания. * /} void loop () {// Время display.clearDisplay (); display.setTextColor (БЕЛЫЙ); display.setTextSize (1); display.setCursor (13, 15); display.setFont (&FreeMonoBoldOblique12pt7b); display.print (clock.getHour (h12Flag, pmFlag)); display.setCursor (38, 15); display.println (":"); display.setCursor (50, 15); display.println (часы.getMinute ()); display.setCursor (70, 15); если (pmFlag) {display.println ("PM"); } еще {display.println ("AM"); } display.setFont (&FreeSans9pt7b); display.setCursor (20, 60); display.println (часы.getDate ()); display.setCursor (40, 60); display.println ("/"); display.setCursor (46, 60); display.println (clock.getMonth (век)); display.setCursor (65, 60); display.println ("/"); display.setCursor (70, 60); display.println («20»); display.setCursor (90, 60); display.println (часы.getYear ()); display.setCursor (30, 30); display.setFont (&FreeSans9pt7b); переключатель (часы.getDoW ()) {случай 1:display.println ("суббота"); ломать; случай 2:display.println («Воскресенье»); ломать; случай 3:display.println («Понедельник»); ломать; случай 4:display.println («вторник»); ломать; случай 5:display.println («Среда»); ломать; случай 6:display.println («Четверг»); ломать; случай 7:display.println («Пятница»); ломать; } display.display (); задержка (5000); // P display.clearDisplay (); display.drawBitmap (0, 0, frame0, 40, 40, 1); display.setFont (&FreeSans9pt7b); display.setCursor (41, 28); display.println (bmp.readPressure () / 100); display.setCursor (110, 28); display.setFont (); display.println ("гПа"); display.setCursor (0, 55); display.setFont (&FreeSans9pt7b); display.println ("Высота:"); display.setCursor (65, 62); display.println (bmp.readAltitude (1005.47)); display.setCursor (113, 62); display.println («м»); display.display (); задержка (5000); // T &RH display.clearDisplay (); display.setFont (&FreeMonoBoldOblique12pt7b); display.drawBitmap (0, 5, frame1, 40, 51, 1); display.setCursor (35, 30); display.print (bmp.readTemperature ()); display.setFont (&FreeSans9pt7b); display.setCursor (102, 28); display.println ("*"); display.setCursor (110, 31); display.println («C»); display.setFont (); display.setCursor (66, 45); display.println ("RH:"); байт RH =dht.readHumidity (); display.setCursor (95, 45); display.println (RH); display.setCursor (110, 45); display.println ("%"); display.drawBitmap (0, 56, frame2, 135, 15, 1); display.display (); задержка (5000); // UV display.clearDisplay (); float sensorValue =analogRead (A0); float sensorVoltage =sensorValue / 1024 * 5,0; int UV_index =sensorVoltage / 0,1; display.setFont (&FreeSans9pt7b); display.setCursor (0, 15); display.print («УФ ИНДЕКС»); display.setCursor (58, 45); display.println (UV_index); display.display (); задержка (5000);} 

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

Схема


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

  1. Метеостанция на основе Raspberry Pi
  2. Метеостанция Raspberry Pi 2
  3. Метеостанция Raspberry Pi
  4. Метеостанция V 2.0
  5. 6-Shooter:станция для смешивания напитков Arduino
  6. Многотемпературный датчик
  7. Регистратор данных с погодными шарами на базе Arduino
  8. Портативная метеостанция Arduino (AWS) за 10 долларов
  9. Метеостанция ThingSpeak Arduino
  10. Датчик WiFi ESP8266 и DHT22