Innehållsförteckning:

Mini Weather Station With Attiny85: 6 steg (med bilder)
Mini Weather Station With Attiny85: 6 steg (med bilder)

Video: Mini Weather Station With Attiny85: 6 steg (med bilder)

Video: Mini Weather Station With Attiny85: 6 steg (med bilder)
Video: AtTiny85 based Mini Weather Station using DHT22 Sensor OLED Display & 16x2 I2C LCD 2024, Juli
Anonim
Mini väderstation med Attiny85
Mini väderstation med Attiny85
Mini väderstation med Attiny85
Mini väderstation med Attiny85
Mini väderstation med Attiny85
Mini väderstation med Attiny85

I en nyligen instruerbar Indigod0g beskrev en mini -väderstation som fungerar ganska bra, med två Arduinos. Kanske vill inte alla offra 2 Arduinos för att få fukt- och temperaturavläsningar och jag kommenterade att det borde vara möjligt att göra en liknande funktion med två Attiny85. Jag antar att det är lätt att prata, så det är bättre att lägga mina pengar där min mun är.

Faktum är att om jag kombinerar två tidigare instruktioner skrev jag:

2-trådigt LCD-gränssnitt för Arduino eller Attiny och Ta emot och skicka data mellan Attiny85 (Arduino IDE 1.06) då är det mesta av arbetet redan gjort. Behöver bara anpassa programvaran lite.

Jag valde en tvådelad LCD -lösning med ett skiftregister, snarare än en I2C LCD eftersom att Attiny är skiftregistret lättare att implementera än I2C -bussen. Men … om du till exempel vill läsa en BMP180 eller BMP085 trycksensor, behöver du I2C för det ändå så att du lika gärna kan använda en I2C LCD då också. TinyWireM är ett bra bibliotek för I2C på en Attiny (men det kräver extra utrymme).

BOM Sändaren: DHT11 Attiny85 10 k motstånd 433MHz sändarmodul

Mottagaren Attiny85 10k motstånd 433 MHz mottagarmodul

Displayen 74LS164 skiftregister 1N4148 diod 2x1k motstånd 1x1k variabelt motstånd en LCD -display 2x16

Steg 1: Miniväderstation med Attiny85: sändaren

Mini -väderstation med Attiny85: sändaren
Mini -väderstation med Attiny85: sändaren
Mini -väderstation med Attiny85: sändaren
Mini -väderstation med Attiny85: sändaren
Mini -väderstation med Attiny85: sändaren
Mini -väderstation med Attiny85: sändaren
Mini -väderstation med Attiny85: sändaren
Mini -väderstation med Attiny85: sändaren

Sändaren är en mycket grundläggande konfiguration av Attiny85 med ett uppdragningsmotstånd på återställningslinjen. En sändarmodul är ansluten till digital stift '0' och DHT11 -datapinnen fästs på digital stift 4. Fäst en tråd på 17,2 cm som antenn (för en mycket bättre antenn, se steg 5). Programvaran är följande:

// fungerar på Attiny // RF433 = D0 stift 5

// DHT11 = D4 pin 3 // bibliotek #include // Från Rob Tillaart #include dht DHT11; #define DHT11PIN 4 #define TX_PIN 0 // pin där din sändare är ansluten // variabler float h = 0; flyta t = 0; int transmit_t = 0; int transmit_h = 0; int transmit_data = 0; void setup () {pinMode (1, INPUT); man.setupTransmit (TX_PIN, MAN_1200); } void loop () {int chk = DHT11.read11 (DHT11PIN); h = DHT11.fuktighet; t = DHT11.temperatur; // Jag vet, jag använder tre heltalsvariabler här // där jag kan använda 1 // men det är bara så att det är lättare att följa transmit_h = 100* (int) h; transmit_t = (int) t; transmit_data = transmit_h+transmit_t; man.transmit (transmit_data); fördröjning (500); }

Programvaran använder Manchester -kod för att skicka data. Den läser DHT11 och lagrar temperaturen och luftfuktigheten i 2 separata flottörer. Eftersom Manchester-koden inte skickar flottörer, men ett heltal, har jag flera alternativ: 1- dela upp flottörerna i två heltal vardera och skicka dessa2- skicka varje flottör som ett heltal3- skicka de två flottörerna som ett heltal Med alternativ 1 måste jag kombinera heltalen i flyter igen i mottagaren och jag måste identifiera vilket heltal som är, vilket gör koden långvarig Med alternativ 2 måste jag fortfarande identifiera vilket heltal som är för fuktighet och vilket för temperatur. Jag kan inte gå efter sekvens ensam om ett heltal går förlorat i överföringen, så jag skulle behöva skicka en identifierare kopplad till heltalet. Med alternativ 3 kan jag skicka bara ett heltal. Uppenbarligen gör detta avläsningarna lite mindre exakta - inom 1 grad- och man kan inte skicka under noll temperaturer, men det är bara en enkel kod och det finns sätt att kringgå det. För närvarande handlar det bara om principen. Så det jag gör är att göra om flottörerna till heltal och jag multiplicerar luftfuktigheten med 100. Sedan lägger jag till temperaturen till den multiplicerade luftfuktigheten. Med tanke på att luftfuktigheten aldrig kommer att vara 100% max nummer jag får är 9900. Med tanke på att temperaturen inte heller kommer att vara över 100 grader kommer max -talet att vara 99, därför är det högsta numret jag kommer att skicka 9999 och det är lätt att skilja på mottagarsidan. min beräkning där jag använder 3 heltal är överkill eftersom det enkelt kan göras med 1 variabel. Jag ville bara göra koden lättare att följa. Koden sammanställs nu som:

Binär skissstorlek: 2, 836 byte (av maximalt 8, 192 byte) så att det passar in i Attiny 45 eller 85NOTERA dht.h -biblioteket jag använder är det från Rob Tillaart. Det biblioteket är också lämpligt för en DHT22. Jag använder version 1.08. Attiny85 kan dock ha problem med att läsa en DHT22 med lägre versioner av biblioteket. Det har bekräftats för mig att 1.08 och 1.14 - även om de arbetar på en vanlig Arduino - har problem med att läsa en DHT22 på Attiny85. Om du vill använda en DHT22 på Attiny85 använder du 1,20 -versionen av detta bibliotek. Allt har att göra med timing. 1.20 -versionen av biblioteket har en snabbare läsning. (Tack för den användarupplevelsen Jeroen)

Steg 2: Miniväderstation med Attiny85: mottagaren

Mini väderstation med Attiny85: mottagaren
Mini väderstation med Attiny85: mottagaren

Återigen används Attiny85 i en grundkonfiguration med Återställningsstiftet draget högt med ett 10 k motstånd. Mottagarmodulen är ansluten till digital pin 1 (pin 6 på chipet). LCD -skärmen är ansluten till digitala stift 0 och två. Fäst en tråd på 17,2 cm som antenn. Koden är följande:

#omfatta

#include LiquidCrystal_SR lcd (0, 2, TWO_WIRE); #define RX_PIN 1 // = fysisk pin 6 void setup () {lcd.begin (16, 2); lcd.home (); man.setupReceive (RX_PIN, MAN_1200); man.beginReceive (); } void loop () {if (man.receiveComplete ()) {uint16_t m = man.getMessage (); man.beginReceive (); lcd.print ("Fuktigt:"); lcd.print (m/100); lcd.setCursor (0, 1); lcd.print ("Temp"); lcd.print (m%100); }}

Koden är ganska enkel: det överförda heltalet tas emot och lagras i variabeln 'm'. Det divideras med 100 för att ge luftfuktigheten och modulo 100 ger temperaturen. Antag att heltalet som mottogs var 33253325/100 = 333325 % 100 = 25Denna kod sammanställs som 3380 byte och kan därför endast användas med en attiny85, inte med en 45

Steg 3: Miniväderstation med Attiny85/45: displayen

Mini -väderstation med Attiny85/45: displayen
Mini -väderstation med Attiny85/45: displayen
Mini -väderstation med Attiny85/45: displayen
Mini -väderstation med Attiny85/45: displayen

För displayen är det bäst att jag hänvisar till min instruktion på en tvåtrådig display. Kort sagt, en vanlig 16x2 -skärm använder en shiftregister så att den kan fungera med två digitala stift. Naturligtvis om du föredrar att använda en I2C -klar display, det vill säga också möjligt, men då måste du implementera ett I2C -protokoll på Attiny. Tinywire -protokollet kan göra det. Även om vissa källor säger att det förväntar sig en 1 Mhz -klocka, hade jag inga problem (i ett annat projekt) att använda den på 8MhzAlla jag störde mig inte här och använde ett skiftregister.

Steg 4: Miniväderstation med Attiny85/45: Möjligheter/slutsatser

Mini Weather Station med Attiny85/45: Möjligheter/slutsatser
Mini Weather Station med Attiny85/45: Möjligheter/slutsatser
Mini Weather Station med Attiny85/45: Möjligheter/slutsatser
Mini Weather Station med Attiny85/45: Möjligheter/slutsatser
Mini Weather Station med Attiny85/45: Möjligheter/slutsatser
Mini Weather Station med Attiny85/45: Möjligheter/slutsatser

Som sagt, jag gjorde detta instruerbart för att visa att man kan göra en miniväderstation med två attiny85 (även med en attiny85+ 1 attiny45). Den sänder bara fuktighet och temperatur med en DHT11. Attiny har dock 5 digitala stift att använda, 6 även med lite knep. Därför är det möjligt att skicka data från fler sensorer. I mitt projekt- som jag ser på bilderna på bandplattan och på ett professionellt kretskort (OSHPark)- skickar/tar jag emot data från en DHT11, från en LDR och från en PIR, allt använder två attiny85's Begränsningen i att använda en attiny85 som mottagare är dock presentationen av data i en flashig stil. Eftersom minnet är begränsat: Texter som "Temperatur, luftfuktighet, ljusnivå, motivet närmar sig" kommer att fylla värdefullt minnesutrymme ganska snabbt. Det finns dock ingen anledning att använda två Arduino bara för att skicka/ta emot temperatur och luftfuktighet. Dessutom är det möjligt för att få sändaren att somna och bara få den att vakna för att skicka data säg var 10: e minut och därmed mata den från en knappcell. Uppenbarligen kan inte bara temperatur- eller luftfuktighetsdata skickas utan man kan ha en rad små sändare som skickar markfuktavläsningar också, eller lägg till en vindmätare eller en regnmätare

Steg 5: Miniväderstation: antennen

Mini Weather Station: antennen
Mini Weather Station: antennen

Antennen är en viktig del av alla 433Mhz -inställningar. Jag har experimenterat med den vanliga 17,2 cm "stav" -antennen och haft en kort flirt med en spolantenn. Det som verkade fungera bäst är en spolad antenn som är lätt att göra. Designen är från Ben Schueler och publicerades tydligen i tidningen "Elektor". En PDF med beskrivningen av denna "luftkylda 433 MHz -antenn" är lätt att följa. (Länken försvann, kolla här)

Steg 6: Lägga till en BMP180

Lägger till en BMP180
Lägger till en BMP180

Vill du lägga till barometrisk trycksensor som BMP180? kolla min andra instruerbara om det.

Rekommenderad: