Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Lokaal weerstation

Componenten en benodigdheden

Arduino Nano R3
× 1
Seeed Grove - Barometersensor (BMP280)
× 1
DHT11 temperatuur- en vochtigheidssensor (4 pinnen)
× 1
ElectroPeak 0.96" OLED 64x128 displaymodule
× 1
GUVA-S12SD UV-sensor
× 1
DS3231 RTC
× 1

Benodigde gereedschappen en machines

Soldeerbout (algemeen)
Soldeerdraad, loodvrij
3D-printer (algemeen)

Apps en online services

Arduino IDE
Autodesk Fusion 360

Over dit project

Ik wilde al heel lang een weerstation maken zonder internet. Het is geweldig om de weergegevens van uw omgeving te meten en de gegevens te bekijken wanneer u dat wilt. dus ik maak een cool uitziend lokaal weerstation dat je omringende luchtdruk, temperatuur, vochtigheid en de UV-index van de dag kan meten (als je het bij het raam plaatst). Wacht, het heeft meer! 😉 het heeft ook een klokscherm voor het weergeven van tijd, datum en dag van de week.

In deze tutorial laat ik je zien hoe je dit cool-weerstation in die stappen kunt maken.

Stap 1:De behuizing bouwen

Ik gebruik Autodesk fusion 360 om de behuizing te maken en deze af te drukken met groen PLA. Het heeft ondersteuning nodig en ik print het met 20% infill met een snelheid van 70 mm/s op mijn Ender 3. Je vindt het STL-bestand voor de behuizing bij dit project.

Stap 2:BMP280

BMP280 is een atmosferische druk- en temperatuursensor en gebruikt het I2C- of SPI-protocol om met de Arduino te communiceren. Hier gebruik ik SPI. Om SPI te gebruiken, verbind-

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

In het codegedeelte hebben we een bibliotheek nodig om deze sensor te gebruiken. allereerst neem ik de bibliotheek op in de code #include . je kunt de bibliotheek hier downloaden.

Vervolgens definieer ik de SPI-pin voor de sensor. In de setup-functie initialiseer ik de BMP-sensor en in de loop-functie lees ik de druk- en temperatuurgegevens met behulp van bmp.readPressure() en bmp.readTemperature() opdracht. Ik deel de drukwaarde door 100 om de druk in de hPa-eenheid te meten. Om de hoogte te meten gebruik ik bmp.readAltitude (1005.47) opdracht. Hier moet je de waarde veranderen (1005.47) volgens de gemiddelde luchtdruk in uw gebied.

Stap 3:DS3231 RTC

Dit weerstation heeft ook een tijdscherm dat de huidige tijd, datum en dag van de zwakken kan weergeven. Hiervoor gebruik ik de DS231 RTC-module, die het I2C-protocol gebruikt om te communiceren. dus om dit te gebruiken, verbind-

  • SCL naar A5
  • SDA naar A4

allereerst moet u de tijd en datum op de RTC instellen met behulp van de DS3231_set.ino programma uit de bibliotheek Voorbeeld.

In het hoofdprogramma neem ik de bibliotheek #include . op en lees de tijdgegevens volgens de instructie van de bibliotheek. hier gebruik ik het voorbeeld uit de bibliotheek als referentie voor de code. Ik heb voor elke dag van een week een case gemaakt om de huidige dag te vinden.

Stap 4:DHT11

Ik gebruik deze sensor om de luchtvochtigheid te meten. Daarvoor verbind ik de data out naar Arduino D2 . En in het programma neem ik de DHT-bibliotheek op #include dan initialiseer ik in de setup de sensor en in de lus lees ik de vochtigheidswaarde met behulp van dht.readHumidity() commando.

Stap 5:GUVA-S12SD UV-sensor

GUVA-S12SD is een op galliumnitride gebaseerde Schottky-type fotodiode. Het heeft een typische UV-detectiegolflengte van 240-370 nm (die UVB en het grootste deel van het UVA-spectrum dekt). Het geeft een gekalibreerde analoge spanning af die varieert met de intensiteit van het UV-licht. We kunnen dus de analoge waarde uitlezen via Arduino ADC.

in de lusfunctie lees ik analoog de sensorwaarde en bereken ik de UV-index

float sensorValue =analogRead(A0);
float sensorVoltage =sensorValue / 1024 * 5.0;
int UV_index =sensorVoltage / 0.1;

Stap 6:OLED-display

Ik gebruik een 0,96-inch 128 * 64 OLED-scherm voor dit project, het gebruikt het I2C-protocol, dus ik sluit het als volgt aan op Arduino-

  • SCK naar A5
  • SDA naar A4

In het programma neem ik eerst de Adafruit_SSD1306 en Adafruit_GFX bibliotheek op

#include 
#include

dan maak ik de weergavevariabele en voeg ik ook een bitmap toe om sommige afbeeldingen weer te geven. In de setup initialiseer ik het display. dan geef ik in de loop alle gegevens weer met behulp van de display.print() functie. Ik geef de gegevens weer op vier pagina's, Tijd, Druk, temperatuur &vochtigheid en UV_index. er is een vertraging van 5 seconden tussen elke pagina.

Videoclip

Code

  • Lokale weerstationcode
Lokale weerstationcodeArduino
#include #include #include #include #include #include #include #include #include //#include #define SCREEN_WIDTH 128#define SCREEN_HEIGHT 64#define OLED_RESETSID 4 , OLED_RESET);#define BMP_SCK (13)#define BMP_MISO (12)#define BMP_MOSI (11)#define BMP_CS (10)DS3231 klok;bool eeuw =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 unsigned char PROGMEM frame0 [] ={0x00, 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,01, 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, 0x023, 0x38 0x00, 0x06, 0x3C, 0x3C, 0x01, 0x80, 0x00, 0x3C, 0x38, 0x00, 0x80, 0x00, 0x1C, 0x38, 0x00, 0xC0, 0x00, 0x1C, 0x78, 0x00, 0xE0,0x00, 0x, 0x 0xF0, 0x03, 0x9E, 0x79, 0xC0, 0x7C, 0x03, 0x9E, 0x78, 0x00, 0x7E, 0x00, 0x1E, 0x38, 0x00, 0x7E, 0x00, 0x1C, 0x38, 0xFC, 0,x 01, 0x3F, 0x7E, 0x3F, 0x3C, 0x3C, 0xFE, 0x7E, 0x7F, 0x3C, 0x1C, 0x7E, 0x18, 0x7E, 0x38, 0x1E, 0x3F, 0x00, 0xFC, 0x78, 0x0F, 0x3F, 0xC, 0x3F, 0xC 0xFF, 0xF8, 0xF0, 0x07, 0x87, 0xFF, 0xE1, 0xE0, 0x03, 0xC1, 0xFF, 0x83, 0xC0, 0x03, 0xF0, 0x3C, 0x0F, 0xC0, 0x01, 0xFC, 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, 0x 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,03, 0x00, 0x 0xB4, 0xE0, 0x00, 0x06, 0x80, 0xA6, 0x80, 0x00, 0x04, 0xC0, 0xA6, 0xE0, 0x00, 0x0C, 0x40, 0xA6, 0xE0, 0x00, 0x08, 0x60, 0xA600, 0x 0xA6, 0xE0, 0x00, 0x08, 0x60, 0xA6, 0x80, 0x00, 0x0E, 0xC0, 0xA6, 0xE0, 0x00, 0x03, 0x80, 0xA6, 0x80, 0x00, 0x00, 0x10, 0xA6 0x 0xC0,x 0xA6, 0xE0, 0x00, 0x00, 0x38, 0xA6, 0x80, 0x00, 0x00, 0x6C, 0xA6, 0xE0, 0x00, 0x00, 0x44, 0xA6, 0x80, 0x00, 0x00, 0x6C, 0xA6 0,00,xE0, 0xA6, 0x80, 0x00, 0x00, 0x00, 0xA6, 0x80, 0x00, 0x00, 0x00, 0xA4, 0xE0, 0x00, 0x00, 0x00, 0xA6, 0x80, 0x00, 0x00, 0x40, 0xA6, 0xE0, 0x 0xA6, 0x80, 0x00, 0x01, 0xA0, 0xA6, 0xE0, 0x00, 0x01, 0x30, 0xA6, 0xE0, 0x00, 0x03, 0x10, 0xA6, 0x80, 0x00, 0x02, 0x18, 0xA6,0x 0xE0,06 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,x 0x00, 0x , 0x00, 0x00, 0x0C, 0xC1, 0x98, 0x00, 0x00, 0x04, 0x7F, 0x30, 0x00, 0x00, 0x06, 0x1C, 0x60, 0x00, 0x00, 0x03, 0x81, 0xC0, 0x00, 0x00, 0x00, , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};const unsigned char PROGMEM frame2 [] ={0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x , 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x , 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x , 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, 0x 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 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 setup() { Serial.begin(57600); if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306 mislukt")); } Draad.begin(); dht.begin(); if (!bmp.begin()) { Serial.println(F("Probleem.bmp")); terwijl (1) vertraging (10); } display.clearDisplay(); display.setTextColor(WIT); display.setTextSize(1); display.setCursor(0, 9); display.setFont(&FreeSans9pt7b); display.println("**** LOKAAL ****"); display.setCursor(0, 38); display.setFont(&FreeMonoBoldOblique12pt7b); display.println("water"); display.setCursor(27, 58); display.println("Station"); weergave.weergave(); vertraging (2000); bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Bedrijfsmodus. */ Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */ Adafruit_BMP280::SAMPLING_X16, /* Drukoversampling */ Adafruit_BMP28016:, /*Filter_X Adafruit_BMP280::STANDBY_MS_500); /* Standby-tijd. */}void loop() { //Time display.clearDisplay(); display.setTextColor(WIT); 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(klok.getDate()); display.setCursor(40, 60); display.println("/"); display.setCursor(46, 60); display.println(clock.getMonth(eeuw)); display.setCursor(65, 60); display.println("/"); display.setCursor(70, 60); display.println("20"); display.setCursor(90, 60); display.println(klok.getYear()); display.setCursor(30, 30); display.setFont(&FreeSans9pt7b); switch (clock.getDoW()) { geval 1:display.println("zaterdag"); pauze; geval 2:display.println("zondag"); pauze; geval 3:display.println("maandag"); pauze; geval 4:display.println("dinsdag"); pauze; geval 5:display.println ("woensdag"); pauze; geval 6:display.println ("donderdag"); pauze; geval 7:display.println("vrijdag"); pauze; } weergave.weergave(); vertraging (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("Hoogte:"); display.setCursor(65, 62); display.println(bmp.readAltitude (1005.47)); display.setCursor(113, 62); display.println("m"); weergave.weergave(); vertraging (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 :"); byte RH =dht.readHumidity(); display.setCursor(95, 45); display.println(RH); display.setCursor(110, 45); display.println("%"); display.drawBitmap (0, 56, frame2, 135, 15, 1); weergave.weergave(); vertraging (5000); //UV-display.clearDisplay(); float sensorValue =analoog lezen (A0); vlottersensor Spanning =sensorWaarde / 1024 * 5,0; int UV_index =sensorVoltage / 0.1; display.setFont(&FreeSans9pt7b); display.setCursor(0, 15); display.print("UV-INDEX"); display.setCursor(58, 45); display.println(UV_index); weergave.weergave(); vertraging (5000);}

Aangepaste onderdelen en behuizingen

Schema's


Productieproces

  1. Weerstation gebaseerd op Raspberry Pi
  2. Raspberry Pi 2 weerstation
  3. Raspberry Pi-weerstation
  4. Weerstation V 2.0
  5. 6-Shooter:Arduino-drankmengstation
  6. Multitemperatuursensor
  7. Arduino aangedreven weerballon datalogger
  8. $10 draagbaar Arduino-weerstation (AWS)
  9. ThingSpeak Arduino-weerstation
  10. WiFi ESP8266 en DHT22-sensor
  11. SmartWristband