Arduino værstasjonsprosjekt med wifi. Arduino værstasjon med trådløs temperatursensor. Værstasjonens generelle opplegg

Min kollega var nylig vertskap for en liten vitenskapsmesse.
  Læreren min ba meg om å introdusere et elektronikkprosjekt for studenter. Jeg hadde to dager på å komme med noe interessant og enkelt nok.



Siden værforholdene her er ganske varierende, og temperaturen svinger i området 30-40 ° C, bestemte jeg meg for å lage en hjemme-værstasjon.

Hva er funksjonene til en værstasjon for hjemmet?
  Arduino værstasjon med skjerm - en enhet som samler vær- og miljødata ved hjelp av en rekke sensorer.

Vanligvis er dette følgende sensorer:

  • av vind
  • fuktighet
  • regn
  • temperaturen
  • trykk
  • høyde

Målet mitt er å lage en bærbar stasjonær værstasjon med egne hender.

Hun skal kunne bestemme følgende parametere:

  • temperaturen
  • fuktighet
  • trykket
  • høyde

Trinn 1: Kjøpe de riktige komponentene







  • DHT22, temperatur og fuktighetssensor.
  • BMP180, trykksensor.
  • lodde
  • 40-veis enkelradekontakt

Fra utstyret du trenger:

  • Loddejern
  • Nesetang
  • ledning

Trinn 2: DHT22 temperatur- og fuktighetssensor







Ulike sensorer brukes til å måle temperatur. Populære er DHT22, DHT11, SHT1x

Jeg vil forklare hvordan de skiller seg fra hverandre, og hvorfor jeg brukte DHT22.

AM2302 bruker et digitalt signal. Denne sensoren kjører på et unikt kodesystem og sensorteknologi, så dataene er pålitelige. Berøringselementet er koblet til en 8-bits en-brikke-datamaskin.

Hver sensor i denne modellen er termisk kompensert og nøyaktig kalibrert, kalibreringskoeffisienten er lokalisert i et engangsprogrammerbart minne (OTP-minne). Når du leser avlesninger, vil sensoren huske koeffisienten fra minnet.

Liten størrelse, lavt strømforbruk, lang overføringsavstand (100 m) gjør at AM2302 kan passe til nesten alle bruksområder, og 4 utganger på rad gjør installasjonen veldig enkel.

La oss se på fordeler og ulemper med de tre sensormodellene.

DHT11

Fordeler: krever ikke lodding, den billigste av de tre modellene, raskt stabilt signal, rekkevidde over 20 m, sterk forstyrrelse.
  Ulemper: bibliotek! Det er ingen oppløsningsalternativer, feilen i temperaturmålingene +/- 2 ° С, feilen i målingene av nivået av relativ fuktighet +/- 5%, utilstrekkelig utvalg av målte temperaturer (0-50 ° С).
Bruksområder: hagearbeid, landbruk.

DHT22

Fordeler: det krever ikke lodding, lave kostnader, glatte kurver, små målefeil, stort måleområde, mer enn 20 m område, sterk interferens.
  Ulemper: følsomheten kan være høyere, langsom sporing av temperaturendringer, du trenger et bibliotek.
  Bruksområder: miljøstudier.

SHT1x

Fordeler: det krever ikke lodding, glatte kurver, små målefeil, rask respons, lavt energiforbruk, automatisk hvilemodus, høy stabilitet og datakonsistens.
  Ulemper: to digitale grensesnitt, feilen i å måle luftfuktighetsnivået, området for målte temperaturer 0-50 ° C, du trenger et bibliotek.
  Omfang: drift under alvorlige forhold og i langtidsinstallasjoner. Alle tre sensorene er relativt billige.

forbindelse

  • Vcc - 5V eller 3,3V
  • Gnd - med Gnd
  • Data - til den andre utgaven av Arduino

Trinn 3: BMP180 Trykksender



BMP180 er en barometrisk atmosfærisk trykksensor med et I2C-grensesnitt.
  Barometriske atmosfæriske trykksensorer måler den absolutte verdien av omgivelsesluften. Denne indikatoren avhenger av spesifikke værforhold og av høyden.

BMP180-modulen hadde en 3,3V 662kΩ stabilisator, som jeg ved min egen dumhet ved en tilfeldighet sprengte. Jeg måtte gjøre et kraftslag direkte til brikken.

På grunn av mangelen på en stabilisator, er jeg begrenset i å velge en strømkilde - en spenning over 3,3V vil ødelegge sensoren.
  Andre modeller har kanskje ikke en stabilisator, husk å sjekke tilgjengeligheten.

Tilkoblingsskjema over sensoren og I2C-bussen med Arduino (nano eller uno)

  • SDA - A4
  • SCL - A5
  • VCC - 3,3V
  • GND - GND

La oss snakke litt om press, og dets forhold til temperatur og høyde.

Atmosfærisk trykk når som helst er inkonsekvent. Det komplekse samspillet mellom rotasjonen av jorden, helningen på jordas akse, fører til utseendet på mange områder med høyt og lavt trykk, som igjen fører til en daglig endring i værforholdene. Ved å observere endringen i presset, kan du lage en kortvarig værmelding.

For eksempel betyr et trykkfall vanligvis regnvær eller nærvær av tordenvær (nærmer seg et lavtrykksregion, en syklon). Stigende trykk betyr vanligvis tørt, klart vær (et område med høyt trykk passerer over deg, en antisyklon).

Atmosfærisk trykk varierer også med høyden. Det absolutte trykket i baseleiren på Everest (5400 moh) er lavere enn det absolutte trykket i Delhi (216 moh).

Siden indikatorene for absolutt trykk varierer på hvert sted, vil vi referere til det relative trykket, eller trykket ved havnivået.

Høydemåling

Det gjennomsnittlige havnivået er 1013,25 GPa (eller mbar). Hvis du stiger over atmosfæren, vil denne verdien falle til null. Kurven i høst er forståelig, så du kan beregne høyden selv ved å bruke følgende ligning: alti \u003d 44330 *

Hvis du aksepterer havnivåtrykket på 1013,25 GPa som p0, vil løsningen på ligningen være din nåværende høyde.

Forholdsregler

Ikke glem at BMP180-sensoren trenger tilgang til den omgivende atmosfæren for å kunne lese lufttrykk, ikke plasser sensoren i et lukket etui. En liten ventil vil være nok. Men ikke la den være for åpen - vinden vil slå ned målingene av trykk og høyde. Vurder vindbeskyttelse.

Beskytt mot varme. Nøyaktig temperaturavlesning er nødvendig for å måle trykk. Forsøk å beskytte sensoren mot temperaturendringer og ikke la den være i nærheten av kilder til høye temperaturer.

Beskytt mot fuktighet. BMP180-sensoren er følsom for fuktighet, prøv å forhindre at mulig vann kommer inn i sensoren.

Ikke blinde sensoren. En overraskelse var følsomheten til silikonen i sensoren for lys, som kan komme inn i den gjennom hullet i brikkedekselet. For å få de mest nøyaktige målingene, prøv å beskytte sensoren mot omgivelseslys.

Trinn 4: Sett sammen enheten







Installer en-rads kontakter for Arduino Nano. Generelt klippet vi dem i riktig størrelse og slipt dem litt, slik at de ser ut som om de var. Så lodder vi dem. Etter, installer en-rads kontaktene for DHT22-sensoren.

Vi installerer en 10k motstand fra datautgangen til bakken (Gnd). Vi lodder alt.
  Deretter installerer vi på samme måte en en-rads kontakt for BMP180-sensoren, vi lager 3,3V strøm. Vi kobler alt til I2C-bussen.

Til slutt kobler vi LCD-skjermen til den samme I2C-bussen som BMP180-sensoren.
  (Jeg planlegger senere å koble RTC-modulen (sanntids klokke) til den fjerde kontakten, slik at enheten også viser klokkeslettet).

Trinn 5: Koding




Last ned biblioteker

Følg lenken for å installere biblioteker på Arduino

#include
#include #include #include "DHT.h" #include

SFE_BMP180 trykk;

#define ALTITUDE 20.56 #define I2C_ADDR 0x27 //<<- Add your address here. #define Rs_pin 0 #define Rw_pin 1 #define En_pin 2 #define BACKLIGHT_PIN 3 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7

#definer DHTPIN 2 // hvilken digital pinne vi har koblet til

// Uncomment uansett hvilken type du bruker! // # definere DHTTYPE DHT11 // DHT 11 #definere DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 DHT dht (DHTPIN, DHTTYPE); LiquidCrystal_I2C lcd (I2C_ADDR, En_pin, Rw_in Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin); flyte t1, t2;

void setup () (Serial.begin (9600); lcd.begin (16,2); //<<-- our LCD is a 20x4, change for your LCD if needed // LCD Backlight ON lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); lcd.home (); // go home on LCD lcd.print("Weather Station"); delay(5000); dht.begin(); pressure.begin(); } void loop() { char status; double T,P,p0,a; status = pressure.startTemperature(); if (status != 0) { delay(status);

status \u003d trykk.getTemperatur (T); if (status! \u003d 0) (Serial.print ("1"); lcd.clear (); lcd.setCursor (0,0); lcd.print ("Barotemperatur:"); lcd.setCursor (0,1 lcd.print (T, 2); lcd.print ("deg C"); t1 \u003d T; forsinkelse (3000);

status \u003d trykk. starttrykk (3); if (status! \u003d 0) (// Vent til målingen er fullført: forsinkelse (status);

status \u003d press.getPressure (P, T); if (status! \u003d 0) (lcd.clear (); lcd.setCursor (0,0); lcd.print ("abslt press:"); lcd.setCursor (0,1); lcd.print (P, 2 ); lcd.print ("mb"); forsinkelse (3000);

p0 \u003d trykk. nivå (P, ALTITUDE); // vi er på 1655 meter (Boulder, CO)

a \u003d trykkstørrelse (P, p0); lcd.clear (); lcd.setCursor (0,0); lcd.print ("Altitude:"); lcd.set markør (0,1); lcd.print (a, 0); lcd.print ("meter"); forsinkelse (3000); )))) flyte h \u003d dht.readHumidity (); // Les temperatur som Celsius (standard) float t \u003d dht.readTemperature (); t2 \u003d t; lcd.clear (); lcd.setCursor (0,0); // gå til starten av 2. linje lcd.print ("Fuktighet:"); lcd.setCursor (0,1); lcd.print (h); lcd.print ("%"); forsinkelse (3000); lcd.clear (); lcd.setCursor (0,0); // gå til starten av 2. linje lcd.print ("DHT Tempurature:"); lcd.set markør (0,1); lcd.print (t); lcd.print ("deg C"); forsinkelse (3000); lcd.clear (); lcd.setCursor (0,0); // gå til starten av 2. linje lcd.print ("Gjennomsnittlig temperatur:"); lcd.set markør (0,1); lcd.print ((t1 + t2) / 2); lcd.print ("deg C"); forsinkelse (3000); )

Jeg brukte versjonen av Arduino 1.6.5, koden passer nøyaktig til den, den kan også nærme seg senere. Hvis koden av en eller annen grunn ikke passer, bruker du versjon 1.6.5 som base.

Jeg testet enkeltdeler av systemet på en Arduino UNO. dvs. Jeg koblet ESP-modulen til Uno og studerte den, koblet den fra, koblet deretter nRF24, etc. For den endelige implementeringen av den utenlandske sensoren valgte han Arduino Pro Mini som den nærmeste Uno fra miniatyren.



Når det gjelder strømforbruk ser Arduino Pro Mini også bra ut:

  • det er ingen USB-TTL-omformer, som i seg selv "spiser" mye,
  • lED-en kobles til via en 10k-motstand.

For avansert energibesparing var det planlagt:

  • fjern LED-lampen - strømindikatoren på Arduino Pro Mini (jeg angret, ødela ikke brettet)
  • enten bruk den nakne enheten på Atmel ATmega328 mikroprosessor (ikke brukt)
  • bruk Low Power Library eller JeeLib.

Jeg valgte Low Power Library fra bibliotekene, det er enkelt og inneholder bare det du trenger.


Siden sentralenheten ble planlagt å koble en rekke perifere enheter til den, ble Arduino Mega-styret valgt. I tillegg er den fullt kompatibel med UNO og har mer minne. Når jeg ser fremover, vil jeg si at dette valget var helt berettiget.


Du kan kjøpe en Arduino Mega for omtrent $ 8.

Kraft og strømforbruk

Nå om strøm og strømforbruk.


Arduino Pro Mini kommer i to former:

  • 5V strømforsyning og 16MHz frekvens
  • 3,3V forsyningsspenning og 8MHz frekvens.

Siden radiomodulen nRF24L01 + krever 3,3 V for strøm, og ytelsen er ikke viktig her, kan du kjøpe Arduino Pro Mini på 8MHz og 3.3V.


Samtidig er spenningsområdet til Arduino Pro Mini:

  • 3,35-12 V for 3,3 V-modell
  • 5-12 V for 5 V.

Jeg hadde allerede en Arduino Pro Mini på 5V, det er derfor jeg brukte den. Du kan kjøpe en Arduino Pro Mini for omtrent $ 4.


Sentralenheten vil bli drevet fra 220 V-nettverket gjennom en liten strømforsyningsenhet som gir 12V, 450mA, 5W utgang. Liker dette for $ 5. Det er fremdeles en egen utgang på 5V.



Og hvis dette ikke er nok, kan det være kraftigere. Å spare strøm for sentralenheten gir med andre ord ikke så mye mening. Men for en ekstern trådløs sensor er energisparing den viktigste delen. Men jeg vil heller ikke miste funksjonaliteten.


Derfor vil Arduino Pro Mini og nRF24 radiomodulen bli drevet av en haug med 4 Ni-Mh-batterier.


Og husk maksimal kapasitet på et moderne batteri   omtrent 2500-2700mAh, alt som er mer er enten markedsføringstriks (Ansmann 2850) eller juks (UltraFire 3500).


Jeg bruker ikke Li-Ion-batterier av flere grunner:

  • veldig dyrt
  • når omgivelsestemperaturen synker under 0 ° C, reduseres litium-ion-batteriets kraft til 40-50%
  • de som er billige er laget uten beskyttelse og er utrygge (under kortslutning eller utladning kan de eksplodere og brenne, se en haug med videoer på YouTube)
  • blir gamle, selv om de ikke brukes (selv om dette kan sies om alle kjemiske elementer), etter 2 år mister Li-Ion-batteriet omtrent 20% av kapasiteten.

For prototypen er det fullt mulig å slippe med Ni-MH AA- eller AAA-batterier av høy kvalitet. Dessuten trenger vi ikke store strømmer. Det eneste minus med Ni-MH-batterier er deres lange lading.

Værstasjonens generelle opplegg

For å oppsummere. Her er en generell oversikt over hvordan alt fungerer.



For å bli videreført.

Tagger: Legg til tagger

  Som de fleste som jobber, tar det å være med på egne prosjekter den eneste gjenværende fritid. Derfor skapte jeg ikke og “klø hendene” i lang tid for å gjøre noe. Denne muligheten dukket merkelig ut på universitetet. Utenfor vinduet er september, 4 år og et forestående kurs på kretsløp. Vi ble fortalt at kurs kan gjøres i to varianter: papir og maskinvare.

I 5 år ble papirer på universitetet gjort på prinsippet om å "ta de gamle og sette dem sammen." Denne tilnærmingen passet meg ikke med sin rutine, så jeg valgte umiddelbart et kurs i maskinvaren. Arduino mikrokontroller ble foreslått som hjertet i kursene på grunn av dets lette læring. Etter å ha bestemt hvilken type kurs, var det et spørsmål til: hva som egentlig skulle gjøres. Siden det ikke var noen erfaring med programmering av mikrokontrollere, åpnet jeg Google umiddelbart og begynte å studere eksisterende prosjekter. Det er mange prosjekter, noen av dem er ganske enkle, noen er strålende (for eksempel 3D-skanner), men de aller fleste hadde ikke praktisk anvendelse. Og jeg ville akkurat det som ikke skulle ligge på en hylle senere og samle støv der. Etter en halv times utflukt til Arduinos verden, var jeg interessert i emnet hjemmeværende værstasjoner, og prosjektene virket ikke veldig vanskelige å gjennomføre (noe som i utgangspunktet bestikk nykommeren).

Slik ble emnet valgt for kurset, og over tid så det ut til at problemer ikke ble skissert.

Komponentvalg

  Når jeg så gjennom forskjellige prosjekter, skjønte jeg at Nano eller til og med en Pro Mini ville være ganske nok for meg, men likevel valgte jeg Arduino Uno i håp om at jeg kunne tenke meg å programmere for Arduino, og i fremtiden vil jeg implementere noen andre prosjekter. Loddejernet hadde aldri blitt holdt i hendene før. Derfor, for enklere utvikling, bestemte jeg meg også for å kjøpe Sensor Shield v4.

Flere detaljer

Brettet letter rask tilkobling av sensorer, moduler, servomotorer, Serial og I2C-grensesnitt, og viser også alle portene til Duemilanova / Uno formfaktorkontroller (det kan også kobles til megaserien, men med begrensninger og konsekvenser). Støtter andre skjold på toppen av seg selv.


  Jeg valgte følgende sensorer som kilder for meteorologiske data:


Jeg bestemte meg for sensorene. Men hva skal man gjøre med dataene som kommer fra sensorene. Jeg bestemte meg for å vise. Jeg ville ha et fargebilde, så jeg droppet de monokrome løsningene med en gang. Etter noen minutters søk ble 1,8-tommers ST7735 TFT-skjerm valgt.

Flere detaljer

Siden skjermen bruker en 4-leder SPI-protokoll for kommunikasjon og har en egen pikseladresserbar rammebuffer, kan den brukes med alle typer mikrokontroller. 1,8-tommers skjerm har 128x160 fargepiksler. Det er også et microSD-kortspor, derfor kan du enkelt laste ned fullfarge bitmap-bilder fra FAT16 / FAT32-filsystemet på microSD-kortet.

funksjoner:

  • Skjermdiagonal - 1,8 tommer, oppløsning 128x160 piksler, 18-biters farge (262,144 farger)
  • Kontroller med integrert pikselminneadressing for videobufferen
  • Innebygd microSD-spor - bruker mer enn to digitale linjer
  • Kompatibel med 3,3 og 5V
  • Mål: 34 mm x 56 mm x 6,5 m


Arduino-kontrollerprogrammering

  Etter at vi har bestemt oss for komponentene til værstasjonen, begynner vi å programmere kontrolleren. For Arduino firmware ble Arduino IDE utviklingsmiljø brukt. Brukte også biblioteker fra Adafruit.

Før du går videre til skissen, bør du vurdere funksjonaliteten:

  • Avlesninger tas fra sensorene hvert 10. sekund, og bare indikatorene som er endret sammenlignet med forrige måling, blir oppdatert på skjermen
  • Implementert dataoverføring via COM-port

skisse

#include   // bibliotek for kommunikasjon med I2C-enheter #include   // Kjernebibliotek for alle sensorer # inkluderer   // bibliotek for BMP180 # inkluder   // Kjerne grafikkbibliotek #include   // Maskinvarespesifikt bibliotek #include // bibliotek for kommunikasjon med SPI-enheter # inkluder "dht.h" // bibliotek for DHT #define DHT22_PIN 2 // koble datapinne av DHT22 til 2 digital pin #define TFT_CS 10 // koble CS-pin av TFT til 10 digital pin #definere TFT_RST 9 // koble RST-pinnen av TFT til 9 digital pin // du kan også koble denne til Arduino reset // i så fall, sett denne #define pin til 0! #definere TFT_DC 8 // koble DC-stift av TFT til 8 digitalpinne Adafruit_ST7735 tft \u003d Adafruit_ST7735 (TFT_CS, TFT_DC, TFT_RST); // initialisere TFT #definere TFT_SCLK 13 // koble SCLK-pinnen av TFT til 13 digital pinne # definere TFT_MOSI 11 // koble MOSI-pinnen av TFT til 11 digital pinn dht DHT; Adafruit_BMP085_Unified bmp \u003d Adafruit_BMP085_Unified (10085); // initialisere BMP180 int bmpFlag \u003d 0; struct (uint32_t total; uint32_t ok; uint32_t crc_error; uint32_t time_out; uint32_t connect; uint32_t ack_l; uint32_t ack_h; uint32_t ukjent;) stat \u003d (0,0,0,0,0,0,0,0); // struct for dht status void setup (void) (Serial.begin (9600); Serial.println ("Meteo Test"); Serial.println (""); hvis (! bmp.begin ()) // sjekk tilkoblingen for BMP180 (Serial.print ("Oops, ingen BMP180 oppdaget ... Kontroller ledningene eller I2C ADDR!"); bmpFlag \u003d 1;) tft.initR (INITR_BLACKTAB); // Initialiser TFT og fyll med svart farge tft.fillScreen (ST7735_BLACK); tft.setRotation (tft.getRotation () + 1); tft.setTextSize (1.5); forsinkelse (500); // forsinkelse for å sikre at TFT ble initialisert) // sist målte data flyter oldTemperature \u003d 0 , oldAltitude \u003d 0, oldPressure \u003d 0, oldDHTHumidity \u003d 0, oldDHTTemperature; bool wasUpdate \u003d falsk; void loop (void) (hvis (Serial.available ()\u003e 0) // vi har data er Serial port (Serial.read (); // les byte fra seriell port og send sist målte data printValue ("Pressure", oldPressure , "hPa", falsk); printValue ("Temperatur", oldTemperature, "C", falsk); printValue ("Altitude", oldAltitude, "m", false); printValue ("Fuktighet", gammelDHTHumidity, "%", falsk); printValue ("DHT_temperature", oldDHTTemperature, "C", false); Serial.println ("END_TRANSMISSION");) sensors_event_t hendelse; flytemperatur, høyde; hvis (bmpFlag \u003d\u003d 0) (bmp.getEvent (& event) ; // få data fra BMP180 if (event.pressure) (bmp.getTemperature (& temperatur); float seaLevelPressure \u003d SENSORS_PRESSURE_SEALEVELHPA; altitude \u003d bmp.pressureToAltitude (seaLevelPressure, event.pressure, temperatur);) else (Serial.println ("Sensor" feil ");)) uint32_t start \u003d micros (); int chk \u003d DHT.read22 (DHT22_PIN); // få data fra DHT22 uint32_t stop \u003d micros (); stat.total ++; bytte (chk) // sjekk status for DHT22 (sak DHTLIB_OK: stat.ok ++; break; sak DHTLIB_ERROR_CHECKSUM: stat.crc_error ++; Serial.print ("Checksum-feil, \\ t"); break; sak DHTLIB_ERROR_TIMEOUT: stat.time_out ++; Serial.print ("Time out-feil, \\ t"); break; sak DHTLIB_ERROR_CONNECT: stat.connect ++; Serial.print ("Tilkoblingsfeil, \\ t"); break; sak DHTLIB_ERROR_ACK_L: stat.ack_l ++; Serial.print ("Ack Low error, \\ t"); break; sak DHTLIB_ERROR_ACK_H: stat.ack_h ++; Serial.print ("Ack High error, \\ t"); break; standard: stat.unbekjent ++; Serial.print ("Ukjent feil, \\ t"); break; ) if (bmpFlag! \u003d 0 || ! event.pressure) // oppdater data (tft.fillRect (0, 30, 160, 6, ST7735_BLACK); tft.setCursor (0, 30); tft.setTextColor (ST7735_RED); printValue ("ERROR BMP INITIALIZATION", 0 , "", sant);) annet (hvis (event.pressure! \u003d oldPressure) (tft.fillRect (0, 30, 160, 7, ST7735_BLACK); tft.setCursor (0, 30); tft.setTextColor (ST7735_RED) ; printValue ("Pressure", event.pressure, "hPa", true); oldPressure \u003d event.pressure; wasUpdate \u003d true;) if (temperatur! \u003d oldTemperature) (tft.fillRect (0, 38, 160, 7, ST7735_BLACK ); tft.setCursor (0, 38); tft.setTextColor (ST7735_WHITE); printValue ("Temperatur", temperatur, "C", sann); oldTemperature \u003d temperatur; wasUpdate \u003d true;) if (høyde! \u003d oldAltitude) ( tft.fillRect (0, 46, 160, 7, ST7735_BLACK); tft.setCursor (0, 46); tft.setTextColor (ST7735_BLUE); printValue ("Altitude", høyde, "m", sant); oldAltitude \u003d høyde; wasUpdate \u003d true;)) if (DHT.humidity! \u003d oldDHTHumidity) (tft.fillRect (0, 54, 160, 7, ST7735_BLACK); t ft.set Markør (0, 54); tft.setTextColor (ST7735_GREEN); printValue ("Fuktighet", DHT.fuktighet, "%", sant); oldDHTHumidity \u003d DHT.fuktighet; wasUpdate \u003d true; ) if (DHT.temperature! \u003d oldDHTTemperature) (tft.fillRect (0, 80, 160, 7, ST7735_BLACK); tft.setCursor (0, 80); tft.setTextColor (ST7735_YELLOW); printValue ("DHT_temperature", DHT. temperatur, "C", sann); oldDHTTemperature \u003d DHT.temperature; wasUpdate \u003d true;) if (wasUpdate) (Serial.println ("END_TRANSMISSION");) wasUpdate \u003d falsk; forsinkelse (10000); ) void printValue (char * title, double value, char * measure, bool tftPrint) (if (tftPrint) // print data to TFT (tft.print (title); tft.print (":"); tft.print ( verdi); tft.println (måling);) Serial.print (tittel); // sende data til Serial port Serial.print (":"); Serial.print (value); Serial.println (måle);)

Det er på tide å sette sammen saken

  Hovedbetingelsen for kurset var en fungerende prototype i en presentabel form. Derfor måtte jeg kjøpe et bygg og, bevæpnet med en fil, legge værstasjonen inn i bygningen på noen måte.

En sak ble kjøpt i en lokal elektronikkbutikk.

bolig

(På bildet er saken litt annerledes. Lokket mitt er gjennomsiktig)



  Deretter ble det laget hull for å sende ut sensorer og levere strøm. Jeg bestemte meg for å ta sensorene ut, siden jeg under testingen av systemet uten saken la merke til at baksiden av skjermen er veldig varm, noe som vil påvirke temperaturen inne i saken.

Hus med hull for sensorer og strøm



Siden jeg måtte lodde bena til 2 sensorer og jeg brente banen på en av dem, bestemte jeg meg for å ikke friste skjebnen og ikke lodde ledningene til sensorene (jeg vil øve på noe annet), men for å gjøre forbindelsen mer eller mindre pålitelig, bestemte jeg meg for å spole tilbake elektrisk tape.

System før du "stapper" inn i huset



  Siden saken er mye større enn Arduino (det var mindre), måtte jeg komme med en støtte for at styret ikke skulle gå inn i saken. Dessuten ble en figur skåret ut av paralon, og i den et rektangel for skjermen for å skjule innsiden av saken. Superlim var ikke for hånden, så jeg måtte sitte på en tosidig tape.

Wonderland Whale Fish



  Vi fester lokket, kobler strømmen og venter.

Ferdig værstasjon i bygningen



  Etter at resultatene vises på skjermen, avslører vi en ubehagelig feil i måling av fuktighet: DHT22 gir nøye tallet 99,90% (svært sjelden 1,00%). Vi begynner å forstå hva problemet er. Det første vi gjør er å se på utgangen av verdier til COM-porten. Alt ser ut til å gå bra. Etter flere påfyll, demontering og montering av saken, kommer ideen til å lete etter svaret i Google. Som forventet sa ikke russiske Google noe fornuftig. Ok. Vi begynner å se på engelsk og på et av forumene kommer vi over gutta med et lignende problem. De fire første sidene av diskusjonen gir ikke noe meningsfylt, og på den femte siden finner vi svaret på spørsmålet vårt:
Fuktighetssensorer kan lett påvirkes av gale gasser eller veldig lang eksponering for høy fuktighet IIRC. I databladet er det en prosedyre for hvordan du "tilbakestiller" sensoren, kan du prøve den.

  Spørsmålet var bare når og hvordan jeg klarte å skade DHT22. Men det var på tide å ta kurs og så la jeg løsningen på dette problemet til senere.

etterord

  Kursarbeid ble bestått. Værstasjonen blir utsatt på ubestemt tid til alle haler er stengt på universitetet. Jeg måtte imidlertid tilbake til værstasjonen tidligere enn jeg trodde. Det hendte slik at i midten av november byttet jeg arbeidsplass og i det nye teamet møtte jeg mennesker som er interessert i Arduino-plattformen og lignende. Derfor blusset interessen min for denne plattformen, ikke å ha tid til å kjøle seg opp igjen. Jeg tok ut værstasjonen, koblet den til en datamaskin og husket at jeg overførte data fra Arduino via en COM-port. Og så kom ideen til meg, å skrive et program som mottar data gjennom en COM-port fra Arduino og overføre disse dataene til nasjonal overvåking
  • Arduino
  •    Legg til koder

    På fritiden, og denne gangen skrev han instruksjoner for produksjon av en liten værstasjon. Den vil fungere som en klokke med en dato og vise temperaturer i og utenfor rommet. Som hovedkontroller vil vi bruke Arduino UNO, men et annet brett med Atmega328p ombord vil gjøre. For visning bruker vi grafikkskjermen WG12864B. Vi kobler også to ds18b20 temperatursensorer. Den ene innendørs tar vi den andre utenfor. La oss komme i gang.

    I prosessen med å lage hjemmelagde produkter trenger vi:

    Arduino UNO (Eller noe annet Arduino-kompatibelt brett)
    - WG12864B grafisk skjerm
    - ds18b20 temperatursensor, 2stk
    - Strømforsyning 6 - 12 V
    - Motstand 4,7 Kom 0,25 W, 2 stk.
    - Motstander 100 ohm 0,25 W
    - Batterirom for 4 AAA “pinky” batterier
    - Boks fra kassetten på SEGA-konsollen
    - elektrisk tape
    - koble ledninger
    - kretskort
    - Knapper
    - skrivesakerkniv
    - loddejern
    - Lodd, kolofonium
    - Dobbeltsidig tape

    Trinn 1 Forberede WG12864B3.
    De som ikke har jobbet med skjermer før, kan bli skremt av et stort antall endringer, som ser ut til å være de samme, av skjermer. Jeg vil forklare litt. De fleste skjermer av denne typen fungerer på ks0107 / ks0108-brikker. Alle skjermer kan deles inn i fire typer:

    Alternativ A: HDM64GS12L-4, Crystalfontz CFAG12864B, Sparkfun LCD-00710CM, NKC Electronics LCD-0022, WinStar WG12864B-TML-T

    Alternativ B: HDM64GS12L-5, Lumex LCM-S12864GSF, Futurlec BLUE128X64LCD, AZ-skjermer AGM1264F, Displaytech 64128A BC, Adafruit GLCD, DataVision DG12864-88, Topway LM12864LDW, Digitron SG1286464J12Y, Q1, Q

    Alternativ C: Shenzhen Jinghua Displays Co Ltd. JM12864

    Alternativ D: Wintek-Cascades WD-G1906G, Wintek-GEN / WD-G1906G / KS0108B, Wintek / WD-G1906G / S6B0108A, TECDIS / Y19061 / HD61202, Varitronix / MGLS19264 / HD61202

    De ser nesten like ut. Men de har forskjellige tilkoblingspinner. Jeg valgte, og jeg anbefaler deg, WG12864B3 V2.0, men hvis skjermen ble annerledes, eller du bare ikke har den for hånden, kan du enkelt finne ut av det ved hjelp av tabellen:

    Korte egenskaper:

    Det er mange forskjellige tilkoblingsordninger på Internett, og alt ser ut til å virke. Saken er at det ikke bare er forskjellige skjermer, men også to måter å koble dem til: seriell og parallell. Når du bruker en seriell portforbindelse, trenger vi bare 3 utganger fra mikrokontrolleren. Med et parallelt minimum på 13. Valget i dette tilfellet er åpenbart, Arduino har få konklusjoner. For parallellkobling er tilkoblingsskjemaet som følger:

    For en seriell tilkobling, som vi vil bruke, er ordningen som følger:

    WG12864B - Arduino UNO 1 (GND) - GND 2 (VCC) - + 5V 4 (RS) - 10 5 (R / W) - 11 6 (E) - 13 15 (PSB) - GND 19 (BLA) - gjennom en motstand 100 Ohm - + 5V 20 (BLK) - GND

    For å justere kontrasten, bør et potensiometer være på skjermen. Det er skjermer uten, men nå er det en sjeldenhet:

    En motstand på 100 ohm er nødvendig, slik at en spenning på 5 volt ikke ved et uhell brenner bakgrunnsbelysningsdioder.

    Trinn 2 Saker saken.
    For saken, ta esken fra kassettprefikset Sega. Hvis du ikke finner denne boksen for hånden, kan du bruke en annen sak. Det viktigste er at skjermen og Arduino passer inn i den.

    Klipp den gjennomsiktige filmen på toppen av esken slik at det ikke er igjen stykker:

    Bruk deretter en geistlig kniv til å klippe ut et vindu 37x69 i størrelse for skjermen.

    På baksiden, langs kanten av snittet, limer vi et tosidig tape, helst svart:

    Fjern beskyttelsespapiret fra limbåndet, og lim skjermen på det:

    Fra utsiden skal det se slik ut:

    Under skjermen, også på dobbeltsidig tape, fester vi Arduino, og lager foreløpige utskjæringer for USB-porten og stikkontakten:

    Utklipp til Arduino-stikkontakter må gjøres på begge sider av esken, slik at den kan lukkes fritt:

    Trinn 3 Temperatursensorer.
    Vi vil bruke digitale temperatursensorer DS18B20. Ved å bruke dem får vi stor målenøyaktighet, feilen er ikke mer enn 0,5 ° C, i et bredt temperaturområde -55 ... + 125 ° C. I tillegg utfører den digitale sensoren alle beregningene selv, og Arduino får ganske enkelt ferdige avlesninger. Når du kobler til denne sensoren, må du ikke glemme opptrekksmotstanden, 4,7 kΩ, mellom DQ- og VDD-kontaktene. Flere tilkoblingsalternativer er også mulig. Med ekstern kraft, etter min mening det beste alternativet, vil vi bruke det:

    Med en hvilken som helst strømforsyning kobles sensorene parallelt:

    Vi vil plassere temperaturmåleren på det lille tavlen sammen med to knapper, som vi vil bruke til å stille inn klokkeslett og dato for klokken:

    Felletråden fra begge knappene er koblet til GND, ledningen fra den første knappen er koblet til A0, fra den andre til A1.
    Fest til et tosidig tape ved siden av Arduino:

    Sensoren, som antas å være plassert utenfor rommet, er bedre å velge i et metall, støv og fukttett hus:

    Beregn ledningen med ønsket lengde slik at sensoren kan henges utenfor vinduet, det viktigste er at den ikke skal være mer enn 5 meter, hvis du trenger mer lengde, må du redusere verdien på opptrekksmotstanden.

    Ledningen fra DQ-databussen til begge sensorer er koblet til pinne 5 på Arduino.
    Vdd - +5 Arduino.
    GND - GND Arduino.

    Trinn 4 Kraft.
    For strøm kan du bruke en strømforsyning med en spenning på 6 til 12 volt. Lodd pluggen som passer til Arduino-stikkontakten på enden av fakkeltråden:

    Eller du kan legge batterirommet for fire "AAA", "pinky" batterier i saken. Og koble den positive ledningen fra kupeen til Vin Arduino, og minus til GND.

    Trinn 5 Forberede programmeringsmiljøet.
    Først må du laste ned og installere Arduino IDE fra det offisielle nettstedet

    Og legg også til de to bibliotekene som trengs for skissen. OneWire - nødvendig for kommunikasjon med ds18b20 sensorer:

    U8glib - brukes til å vise informasjon på skjermen:

    Last ned biblioteket. Så pakker vi ut arkivene og flytter innholdet i arkivene i mappen “biblioteker” som ligger i mappen med Arduino IDE installert. Du kan også legge til biblioteker gjennom Arduino IDE. For å gjøre dette, uten å pakke ut arkivene, kjører du Arduino IDE, velger Sketch - Connect Library fra menyen Sketch. Øverst på rullegardinlisten velger du elementet "Legg til.Zip-bibliotek". Vi angir plasseringen av nedlastede arkiver. Etter alle trinnene, må du starte Arduino IDE på nytt.

    Trinn 6 Redigering av skissen.
    Temperatursensorer bruker One Wire-protokollen og har en unik adresse for hver enhet - en 64-biters kode. Det er ikke tilrådelig å legge sensorsøkkommandoer til en skisse. Det er ikke nødvendig å laste Arduino hikke sensorer hver gang. Først må du først sette sammen alt, fylle ut skissen i Arduino, som ligger i Fil-menyen - Eksempler - Dallas temperatur - OneWireSearch. Kjør deretter Tools - Port Monitor. Arduino skal finne sensorene våre, skrive adressene og temperaturavlesningene. Disse adressene må skrives ned eller bare kopieres et sted. Åpne nå skissen Ard_Tic_Tak_WG12864B_2_x_Term_Serial, og se etter linjene:

    Byte addr1 \u003d (0x28, 0xFF, 0x75, 0x4E, 0x87, 0x16, 0x5, 0x63); // intern adresse byte addr2 \u003d (0x28, 0xFF, 0xDD, 0x14, 0xB4, 0x16, 0x5, 0x97); // ekstern adresse sensor

    Vi erstatter adressene som tilsvarer sensorenes plassering med våre adresser.
    Våre klokker bruker ikke RTC-modulen (sanntidsklokke), så du må justere klokken. For enkelhets skyld, fjern linjen (se sekunder på skjermen):

      //u8g.setPrintPos(44, 50); u8g.print (sek); // Skriv ut sekunder for å sjekke korrektheten til kurset

    Still riktig tid gjennom portmonitoren. For å gjøre dette, åpne portmonitoren, vent til de innledende temperaturmålingene er fullført, og skriv inn gjeldende dato og tid i formatet "dag, måned, år, timer, minutter, sekunder." Uten mellomrom, del tallene med komma eller perioder.

    Hvis klokken har det travelt, endre verdien til en større, jeg anbefaler å eksperimentere med trinn på 100 enheter. Hvis du henger, reduser du verdien på linjen:

    Hvis (mikros () - prevmicros\u003e 494000) (// endring til en annen for justering var 500000

    Empirisk bestemme hvor klokken går ganske nøyaktig. For å bestemme nøyaktigheten av kurset og trenger en konklusjon sekunder. Etter nøyaktig kalibrering av tallet, kan sekunder kommenteres og dermed fjernes fra skjermen.
    Fyll skissen.

    I denne artikkelen vil vi snakke om hvordan du kan sette sammen en fullverdig værstasjon som overfører værdata til den kjente tjenesten "populær overvåking".

    Værstasjonen vår vil bestå av to enheter: en kompakt frittstående enhet som måler værindikatorer, og en stafettenhet som mottar disse indikatorene og sender dem til "folks overvåking". Enheter vil kommunisere trådløst med en frekvens på 433 MHz. Den autonome delen vil bli drevet av tre fingerbatterier og kan vare på ett sett med batterier i opptil et år med en sensor pollingperiode på 20 minutter.

    Denne designen lar deg ikke bore vegger for å legge ledninger fra gaten der du trenger å gjøre målinger, inn i rommet hvor resultatene fra disse målingene må brukes.

    Hva skal til for dette?

    For å lage en autonom sender, trenger vi:

      X3 AA fingerbatteriholder

    For å lage repeateren trenger vi:

    Det er også praktisk å installere to lysdioder for å indikere prosesser:

    For en lydindikasjon på batteriets utladning av den autonome delen, er det praktisk å bruke en piezo-diskant:

    Hvordan sette den sammen?

    Montering av den autonome delen

    Repeater Assembly

    Dette fullfører monteringen av den minimalt funksjonelle repeateren. Hvis du vil stille inn LED-indikasjon og lydalarm, følg trinnene nedenfor.


    Kildekode

    Autonom delkode

      meteo_sensor.ino #include    #include    #include    #include // Timeout mellom pakker (ikke mer enn 65535)   #definere TIMEOUT 60000 // Antall forsøk på å sende pakken   #definere ATTEMPTS 3 // Informasjonsnålen til senderen   #definere RF_PIN 5 // Pins på temperatur- og fuktighetssensoren #definere GND1_PIN 10 # definere VCC1_PIN 11 # definere GND2_PIN 7 # definere VCC2_PIN 8 # definere DATA_PIN 12 # definere CLK_PIN 9 AmperkaLine rf (RF_PIN); SHT1x sht1x (CLK_PIN, DATA_PIN); void loop (void); // Funksjonen å avlive styret. Hvert TIMEOUT sekund // loop_func-funksjonen vil bli kalt.   TEENSY3_LP LP \u003d TEENSY3_LP (); sleep_block_t * LP_config; void sleep_mode (void) (LP_config \u003d (sleep_block_t *) calloc (1, sizeof (sleep_block_t)); // Vi våkner av timer    LP_config-\u003e moduler \u003d (LPTMR_WAKE); // Angi tidsavbrudd for tidtakeren    LP_config-\u003e lptmr_timeout \u003d TIMEOUT; // Etter tidsavbrudd vil loopfunksjonen bli kalt    LP_config-\u003e tilbakeringing \u003d loop; LP.Hibernate (LP_config); ) // Funksjon for å slå på eksterne enheter   void periferial_start (void) ( // Slå på datalinjen    pinMode (RF_PIN, OUTPUT); // Slå på strøm- og bakketemperatur- og fuktighetssensorene    pinMode (GND1_PIN, OUTPUT); pinMode (GND2_PIN, OUTPUT); pinMode (VCC1_PIN, OUTPUT); pinMode (VCC2_PIN, OUTPUT); digitalWrite (GND1_PIN, LOW); digitalWrite (GND2_PIN, LOW); digitalWrite (VCC1_PIN, HIGH); digitalWrite (VCC2_PIN, HIGH); // Slå på LED for å indikere overføring    pinMode (LED_BUILTIN, OUTPUT); digitalWrite (LED_BUILTIN, HIGH); // Velg internspenning som referansespenning    // kilde (\u003d 1,2 V) analogReference (INTERN); ) // Funksjonen ved å slå av perifere enheter   void periferial_stop (void) ( // Slå av datalinjen    pinMode (RF_PIN, INPUT); // Slå av temperatur- og fuktighetssensoren    pinMode (GND1_PIN, INPUT); pinMode (GND2_PIN, INPUT); pinMode (VCC1_PIN, INPUT); pinMode (VCC2_PIN, INPUT); pinMode (18, INPUT_PULLUP); pinMode (19, INPUT_PULLUP); // Slå av lysdioden    digitalWrite (LED_BUILTIN, LOW); ) void setup (void) ( // Ikke initialiser noe, sovner umiddelbart    sleep_mode (); ) // Denne funksjonen utføres hvert TIMEOUT sekund   void loop (void) (usignert lang msg; bytemp, fuktighet, spenning; // Slå på periferiutstyr    periferial_start (); // Vent til temperatur- og fuktighetssensoren slås på    forsinkelse (30); // Få innspill fra sensorer    temp \u003d (byte) (sht1x.readTemperatureC () + 40.) * 2; fuktighet \u003d (byte) sht1x.readHumidity (); spenning \u003d analog Les (A0) / 4; // Vi lager en pakke fra dataene    msg \u003d 0; msg | \u003d spenning; msg<<= 8 ; msg | = humidity; msg <<= 8 ; msg | = temp; // Send pakken flere ganger for (int i \u003d 0; i< ATTEMPTS; i++ ) rf.send (msg) ; // Slå av eksterne enheter    periferial_stop (); // Etter å ha gått ut av funksjonen, vil brettet sovne igjen }

    Innendørs styrekode

      receiver.ino #include    #include    #include    #include    byte mac \u003d (0x90, 0xA7, 0xDA, 0x0F, 0xBC, 0x75); char server \u003d "narodmon.ru"; EthernetClient-klient; const int rfpin \u003d 7; AmperkaLine rf (rfpin); void setup (void) (pinMode (rfpin, INPUT); pinMode (6, OUTPUT); Serial.begin (9600); Serial.println ("Started.");) void loop (void) (statisk usignert lang pushtimeout \u003d 0 ; statisk float temp, fuktighet, spenning; usignert lang msg; int res; if ((res \u003d rf.receive (& msg)) \u003d\u003d 0) (temp \u003d ((float) (msg & 0xFF)) / 2. - 40 .; msg \u003e\u003e \u003d 8; fuktighet \u003d (flyte) (msg & 0xFF); msg \u003e\u003e \u003d 8; spenning \u003d (flyte) (msg & 0xFF) / 256. * 1.2 * 10 * 1.1; digitalWrite (6, HIGH); Serial.print ("Temp:"); Serial.print ("temp); Serial.print (", fuktighet: "); Serial.print (fuktighet); Serial.print (", spenning: "); Serial.println ( spenning); digitalWrite (6, LOW);) annet Serial.println ("E"); if (millis () - pushtimeout\u003e 60000 * 5) (pushtimeout \u003d millis (); Serial.println ("Starter Ethernet ... "); if (Ethernet.begin (mac) \u003d\u003d 0) (Serial.println ( "Kunne ikke konfigurere Ethernet ved hjelp av DHCP"); mens (1) ()) forsinkelse (1000); Serial.println ("koble til ..."); if (client.connect (server, 8283)) (Serial.println ("tilkoblet"); client.println ( "# 90-A7-DA-0F-BC-75 # Sensor # 55.751775 # 37.616856 # 0.0"); client.print ("# 90A7DA0FBC7501 #"); client.print (temp, DEC); client.println ("#In"); client.print ("# 90A7DA0FBC7502 #"); client.print (fuktighet, DEC); client.println ("# Fuktighet"); client.print ("# 90A7DA0FBC7503 #"); client.print (spenning, DEC); client.println ("#Voltage"); client.println ("##"); ) else Serial.println ("tilkobling mislyktes"); (usignert lang tm \u003d millis (); mens (millis () - tm< 5000 ) { if (client.available () ) { char c = client.read () ; Serial.print (c) ; } } } client.stop () ; } }

    Registrering av en værstasjon i "People's Monitoring"

    For at dataene som er overført av enheten vår, skal vises korrekt ved populær overvåking, må du gjøre følgende:


    Demonstrasjon av enheten

    Hva annet kan gjøres?

      Teensy har en sanntids klokke (RTC) rett om bord. For deres ytelse mangler bare kvarts. Du kan kjøpe 32,768 KHz kvarts i hvilken som helst radiobutikk og lodde den. Da kan du vekke Teensy på RTC vekkerklokke. Fordelen er at du oftere kan vekke enheten i løpet av de timene når det er nødvendig med mer nøyaktige avlesninger. I arbeidstiden skal du for eksempel vekke enheten hvert 5. minutt, og resten - hver halvtime.