Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Station météo locale

Composants et fournitures

Arduino Nano R3
× 1
Seed Grove - Capteur de baromètre (BMP280)
× 1
Capteur de température et d'humidité DHT11 (4 broches)
× 1
Module d'affichage OLED 64x128 ElectroPeak 0.96"
× 1
Capteur UV GUVA-S12SD
× 1
DS3231 RTC
× 1

Outils et machines nécessaires

Fer à souder (générique)
Fil à souder, sans plomb
Imprimante 3D (générique)

Applications et services en ligne

Arduino IDE
Autodesk Fusion 360

À propos de ce projet

Pendant longtemps, je voulais faire une station météo sans utiliser Internet. Il est bon de mesurer les données météorologiques de votre environnement et de jeter un œil aux données lorsque vous le souhaitez. donc, je fais une station météo locale cool qui peut mesurer la pression atmosphérique, la température, l'humidité et l'indice UV de la journée (si vous la placez près de la fenêtre). Attends il en a plus ! 😉 il dispose également d'un écran d'horloge pour afficher l'heure, la date et le jour de la semaine.

Dans ce tutoriel, je vais vous montrer comment fabriquer cette station par temps frais en suivant ces étapes.

Étape 1 : Construire l'enceinte

J'utilise Autodesk fusion 360 pour créer le boîtier et l'imprimer avec du PLA vert. Il a besoin de supports et je l'imprime avec un remplissage de 20% avec une vitesse de 70 mm/s sur mon Ender 3. Vous trouverez le fichier STL du boîtier avec ce projet.

Étape 2 : BMP280

Le BMP280 est un capteur de pression atmosphérique et de température et il utilise le protocole I2C ou SPI pour communiquer avec l'Arduino. Ici, j'utilise SPI. Pour utiliser SPI, connectez-

  • CS à D10
  • SDA à D11
  • SDO à D12
  • SCK à D13

Dans la partie code, pour utiliser ce capteur, nous avons besoin d'une bibliothèque. tout d'abord, j'inclus la bibliothèque dans le code #include . vous pouvez télécharger la bibliothèque à partir d'ici.

Ensuite, je définis la broche SPI pour le capteur. Dans la fonction de configuration, j'initialise le capteur BMP, et dans la fonction de boucle, je lis les données de pression et de température en utilisant bmp.readPressure() et bmp.readTemperature() commander. Je divise la valeur de la pression par 100 pour mesurer la pression dans l'unité hPa. Pour mesurer l'altitude, j'utilise bmp.readAltitude(1005.47) commander. Ici, vous devez modifier la valeur (1005.47) selon la pression moyenne de votre région.

Étape 3 :DS3231 RTC

Cette station météo dispose également d'un écran d'heure qui peut afficher l'heure, la date et le jour du faible. Pour cela, j'utilise le module DS231 RTC, qui utilise le protocole I2C pour communiquer. donc pour l'utiliser, connectez-

  • SCL vers A5
  • SDA vers A4

tout d'abord, vous devez régler l'heure et la date sur le RTC en utilisant le DS3231_set.ino programme de la bibliothèque Exemple.

Dans le programme principal, j'inclus la bibliothèque #include et lire les données de temps selon les instructions de la bibliothèque. ici, j'utilise l'exemple de la bibliothèque comme référence pour le code. J'ai créé un cas pour chaque jour d'une semaine pour trouver le jour actuel.

Étape 4 :DHT11

J'utilise ce capteur pour mesurer l'humidité. Pour cela, je connecte ses data out vers Arduino D2 . Et dans le programme, j'inclus la bibliothèque DHT #include puis dans le setup j'initialise le capteur et dans la boucle, je lis la valeur d'humidité en utilisant dht.readHumidity() commande.

Étape 5 : Capteur UV GUVA-S12SD

GUVA-S12SD est une photodiode de type Schottky à base de nitrure de gallium. Il a une longueur d'onde de détection UV typique de 240-370 nm (qui couvre les UVB et la plupart du spectre UVA). Il délivre une tension analogique calibrée qui varie avec l'intensité de la lumière UV. Ainsi, nous pouvons lire la valeur analogique via Arduino ADC.

dans la fonction boucle, je lis analogiquement la valeur du capteur et calcule l'indice UV

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

Étape 6 : écran OLED

J'utilise un écran OLED 0.96" 128*64 pour ce projet, il utilise le protocole I2C donc je le connecte à Arduino comme suit-

  • SCK vers A5
  • SDA vers A4

Dans le programme, dans un premier temps, j'inclus les librairies Adafruit_SSD1306 et Adafruit_GFX

#include 
#include

puis je crée la variable d'affichage et ajoute également un bitmap pour afficher certaines images. Dans la configuration, j'initialise l'affichage. puis dans la boucle, j'affiche toutes les données en utilisant le display.print() une fonction. J'affiche les données sur quatre pages, temps, pression, température et humidité et UV_index. il y a un délai de 5 secondes entre chaque page.

Clip vidéo

Code

  • Code de la station météo locale
Code de la station météo localeArduino
#include #include #include #include #include #include #include #include #include //#include #define SCREEN_WIDTH 128#define SCREEN_HEIGHT 64#define OLEDdaHEID_RESET , OLED_RESET);#define BMP_SCK (13)#define BMP_MISO (12)#define BMP_MOSI (11)#define BMP_CS (10)DS3231 clock;bool Century =false;bool h12Flag;bool pmFlag;Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO , BMP_SCK);#define DHTPIN 2#define DHTTYPE DHT11DHT dht(DHTPIN, DHTTYPE);const char non signé PROGMEM frame0 [] ={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, 0x00, 0x3F 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, 0,x023, 0x 0x00, 0x06, 0x3C, 0x3C, 0x01, 0x80, 0x00, 0x3C, 0x38, 0x00, 0x80, 0x00, 0x1C, 0x38, 0x00, 0xC0, 0x00, 0x1C, 0x78, 0x00, 0xE0, 0x38, 0x00, 0xC0, 0x00, 0x1C, 0x78, 0x00, 0xE0, 0x00, 0x 0xF0, 0x03, 0x9E, 0x79, 0xC0, 0x7C, 0x03, 0x9E, 0x78, 0x00, 0x7E, 0x00, 0x1E, 0x38, 0x00, 0x7E, 0x00, 0x1C, 0x38, 0xFC, 0x0x, 0x3F, 0xFC, 0x3F,C 0x7E, 0x3F, 0x3C, 0x3C, 0xFE, 0x7E, 0x7F, 0x3C, 0x1C, 0x7E, 0x18, 0x7E, 0x38, 0x1E, 0x3F, 0x00, 0xFC, 0x78, 0x0F, 0x3F, 0x0x0, 0x3F, 0x0 0xFF, 0xF8, 0xF0, 0x07, 0x87, 0xFF, 0xE1, 0xE0, 0x03, 0xC1, 0xFF, 0x83, 0xC0, 0x03, 0xF0, 0x3C, 0x0F, 0xC0, 0x01, 0xFCx, 0x00, 0x3F, 0x00, 0x3F 0x81, 0xFE, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} ;const char non signé 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, 0,00x, 0x03 0xB4, 0xE0, 0x00, 0x06, 0x80, 0xA6, 0x80, 0x00, 0x04, 0xC0, 0xA6, 0xE0, 0x00, 0x0C, 0x40, 0xA6, 0xE0, 0x00, 0x08, 0x60, 0x08, 0x, 0x80 0xA6, 0xE0, 0x00, 0x08, 0x60, 0xA6, 0x80, 0x00, 0x0E, 0xC0, 0xA6, 0xE0, 0x00, 0x03, 0x80, 0xA6, 0x80, 0x00, 0x00, 0x10, 0xA,00, 0xC, 0xA6, 0xE0, 0x00, 0x00, 0x38, 0xA6, 0x80, 0x00, 0x00, 0x6C, 0xA6, 0xE0, 0x00, 0x00, 0x44, 0xA6, 0x80, 0x00, 0x00, 0x6C, 0xA6,00, 0xE, 0x0,00, 0xE, 0xA6, 0x80, 0x00, 0x00, 0x00, 0xA6, 0x80, 0x00, 0x00, 0x00, 0xA4, 0xE0, 0x00, 0x00, 0x00, 0xA6, 0x80, 0x00, 0x00, 0x40, 0xA6, 0, 0xE0, 0 0xA6, 0x80, 0x00, 0x01, 0xA0, 0xA6, 0xE0, 0x00, 0x01, 0x30, 0xA6, 0xE0, 0x00, 0x03, 0x10, 0xA6, 0x80, 0x00, 0x02, 0x18, 0xA6, 0xE0, 0x, 0x, 0xE0 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, 0x8, 0x00 , 0x00, 0x00, 0x0C, 0xC1, 0x98, 0x00, 0x00, 0x04, 0x7F, 0x30, 0x00, 0x00, 0x06, 0x1C, 0x60, 0x00, 0x00, 0x03, 0x81, 0xC0, 0x00, 0x00x, 0x00 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};const char non signé 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, 0xF F, 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, 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, 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, 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, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0 xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80};void setup() { Serial.begin (57600); if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306 a échoué")); } Fil.begin(); dht.begin(); if (!bmp.begin()) { Serial.println(F("Problème.bmp")); tandis que (1) retard(10) ; } display.clearDisplay(); display.setTextColor(BLANC); display.setTextSize(1); display.setCursor(0, 9); display.setFont(&FreeSans9pt7b); display.println("**** LOCAL ****"); display.setCursor(0, 38); display.setFont(&FreeMonoBoldOblique12pt7b); display.println("eau"); display.setCursor(27, 58); display.println("Station"); display.display(); retard (2000); bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Mode de fonctionnement. */ Adafruit_BMP280::SAMPLING_X2, /* Suréchantillonnage temp. */ Adafruit_BMP280::SAMPLING_X16, /* Suréchantillonnage pression */ Adafruit_BMP280::FILTERing_X16, /* Adafruit_BMP280::STANDBY_MS_500); /* Temps d'attente. */}void loop() { //Time display.clearDisplay(); display.setTextColor(BLANC); 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(clock.getMinute()); display.setCursor(70, 15); if (pmFlag) { display.println (" PM "); } else { display.println(" AM "); } display.setFont(&FreeSans9pt7b); display.setCursor(20, 60); display.println(clock.getDate()); display.setCursor (40, 60); display.println("/"); display.setCursor(46, 60); display.println(clock.getMonth(siècle)); display.setCursor(65, 60); display.println("/"); display.setCursor(70, 60); display.println("20"); display.setCursor(90, 60); display.println(clock.getYear()); display.setCursor(30, 30); display.setFont(&FreeSans9pt7b); switch (clock.getDoW()) { cas 1 :display.println("samedi"); Pause; cas 2 :display.println("dimanche"); Pause; cas 3 :display.println("lundi"); Pause; cas 4:display.println("mardi"); Pause; case 5:display.println("Mercredi"); Pause; cas 6 :display.println("Jeudi"); Pause; cas 7 :display.println("Vendredi"); Pause; } display.display(); retard (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("hPa"); display.setCursor(0, 55); display.setFont(&FreeSans9pt7b); display.println("Altitude :"); display.setCursor(65, 62); display.println(bmp.readAltitude(1005.47)); display.setCursor(113, 62); display.println("m"); display.display(); retard (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 :"); octet 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(); retard (5000); //affichage UV.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(" INDICE UV "); display.setCursor(58, 45); display.println(UV_index); display.display(); retard (5000);}

Pièces et boîtiers personnalisés

Schémas


Processus de fabrication

  1. Station météo basée sur Raspberry Pi
  2. Station météo Raspberry Pi 2
  3. Station météo Raspberry Pi
  4. Weather Station V 2.0
  5. 6-Shooter :Station de mélange de boissons Arduino
  6. Capteur de température multiple
  7. enregistreur de données de ballon météo alimenté par Arduino
  8. Station météo portable Arduino (AWS) à 10 $
  9. Station météo ThingSpeak Arduino