Mini Weather Station With Attiny85

152,630

1,463

173

About: I am a physician by trade. After a career in the pharmeceutical world I decided to take it a bit slower and do things I like. Other than my hobbies that involves grassroots medicine in S.E.&P Asia. I have bu...

Intro: Mini Weather Station With Attiny85

In a recent instructable Indigod0g described a mini weather station that works pretty well, using two Arduinos. Maybe not everyone wants to sacrifice 2 Arduinos to get humidity and temperature readings and I commented that it should be possible to do a similar function with two Attiny85's. I guess talk is easy, so I better put my money where my mouth is.

In fact, if I combine two earlier instructables I wrote:

2-Wire LCD interface for Arduino or Attiny
and
Receiving and sending data between Attiny85 (Arduino IDE 1.06)
then most of the work is already done. Only need to adapt the software a bit.

I chose for a two wire lcd solution with a shift register, rather than an I2C LCD because on the Attiny the shift register is easier to implement than the I2C bus. However... if you for instance want to read a BMP180 or BMP085 pressure sensor, you need I2C for that anyway so you might as well use an I2C LCD then too. TinyWireM is a good library for I2C on an Attiny (but it requires extra space).

BOM
The transmitter:
DHT11
Attiny85
10 k resistor
433MHz transmitter module

The receiver
Attiny85
10k resistor
433 MHz receiver module

The display
74LS164 shift register
1N4148 diode
2x1k resistor
1x1k variable resistor
an LCD display 2x16

Step 1: Mini Weather Station With Attiny85: the Transmitter

The transmitter is a very basic configuration of the Attiny85 with a pull up resistor on the reset line.
A transmitter module is attached to digital pin '0' and the DHT11 data pin attaches to digital pin 4.
Attach a wire of 17.2 cm as antenna (for a much better antenna see step 5).
The software is as follows:

//will work on Attiny85/45

//RF433=D0 pin 5
//DHT11=D4 pin 3

// libraries
#include <dht.h> //From Rob Tillaart
#include <Manchester.h>
dht DHT11;
#define DHT11PIN 4
#define TX_PIN 0  //pin where your transmitter is connected
//variables
float h=0;
float 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.humidity;
 t=DHT11.temperature;
// I know, I am using 3 integer variables here
// where I could be using 1
// but that is just so it is easier to follow
 transmit_h=100* (int) h;
 transmit_t=(int) t;
 transmit_data=transmit_h+transmit_t;
  man.transmit(transmit_data);
  delay(500);
}

The software uses Manchester code to send the data.
It reads the DHT11 and stores the temperature and humidity in 2 separate floats. As the Manchester code doesnt send floats, but an integer, I have several options:
1- split the floats into two integers each and send those
2- send each float as an integer
3- send the two floats as one integer

With option 1 I need to combine the integers into floats again in the receiver and I have to identify which integer is what, making the code long winded
With option 2 I still need to identify which integer is for humidity and which for temperature. I cannot go by sequence alone in case one integer is lost in transmission, so I would need to send an identifier attached to the integer.
With option 3, I can send just one integer. Obviously this makes the readings a bit less accurate - within 1 degree- and one cannot send below zero temperatures, but it is just a simple code and there are ways around that. For now it is just about the principle.

So what I do is I turn the floats into integers and I multiply the humidity with 100. Then I add the temperature to the multiplied humidity.
Given the fact that the humidity will never be 100% the max number I will get is 9900. Given the fact that the temperature will also not be above 100 degrees, the max number will be 99, therefore the highest number i will send is 9999 and that is easy to separate at the receiver side.

Ofcourse my calculation in which i use 3 integers is overkill as it could easily be done with 1 variable. I just wanted to make the code easier to follow.

the code now compiles as:

Binary sketch size: 2,836 bytes (of a 8,192 byte maximum)
so that fits in an Attiny 45 or 85

NOTE the dht.h library I use is the one from Rob Tillaart. That library is also suitable for a DHT22. I am using version 1.08. However the Attiny85 may have problems reading a DHT22 with lower versions of the library. It has been confirmed to me that the 1.08 and 1.14 -though working on a regular Arduino- have trouble reading a DHT22 on the Attiny85. If you want to use a DHT22 on the Attiny85, use the 1.20 version of this library. It all ha sto do with timing. The 1.20 version of the library has a faster read. (Thanks for that user experience Jeroen)

Step 2: Mini Weather Station With Attiny85: the Receiver

Again the Attiny85 is used in a basic configuration with the Reset pin pulled high with a 10 k resistor. The Receiver module is attached to digital pin 1 (pin 6 on the chip). The LCD is attached to digital pins 0 and two.
Attach a wire of 17.2 cm as antenna.
The code is as follows:

#include <Manchester.h>
#include <LiquidCrystal_SR.h>
LiquidCrystal_SR lcd(0,2,TWO_WIRE);
#define RX_PIN 1 //= physical 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("Humid: "); lcd.print(m/100); lcd.setCursor(0,1); lcd.print("Temp "); lcd.print(m%100); } }

The code is fairly simple: the transmitted integer is received and stored in variable 'm'.
It is divided by 100 to give the humidity and the modulo of 100 gives the temperature.
So suppose the integer received was 3325
3325/100=33
3325 % 100=25
This code compiles as 3380 bytes and therefore can only be used with an attiny85, not with a 45

Step 3: Mini Weather Station With Attiny85/45: the Display

For the display it is best that I refer to my instructable on a two wire display.
In short, a common 16x2 display uses a shiftregister so it can operate with two digital pins.
Ofcourse if you prefer to use an I2C ready display, that is possible too, but then you need to implement an I2C protocol on the Attiny. The Tinywire protocol can do that. Though some sources say that that expects a 1 Mhz clock, I didnt have any trouble (in another project) to use it on 8Mhz
Anyway I just didnt bother here and used a shift register.

Step 4: Mini Weather Station With Attiny85/45: Possibilities/Conclusions

As said, I made this instructable to show that one can make a mini weather station with two attiny85's (even with one attiny85+ 1 attiny45).
It only sends humidity and temperature, using a DHT11.
However, the Attiny has 5 digital pins to use, 6 even with some trickery. Therefore it is possible to send data from more sensors.
In my project- as seen in the pics on stripboard and on a professional PCB (OSHPark)- I send/receive data from a DHT11, from an LDR and from a PIR, all using two attiny85's
The limitation in using an attiny85 as receiver though is the presentation of the data in a flashy style. As the memory is limited: Texts like 'Temperature, Humidity, light level, subject approaching' will fill up valuable memory space pretty fast.
Nevertheless, no reason to use two Arduino's just to send/receive temperature and humidity.

Additionallly, it is possible to have the transmitter go to sleep and only have it wake up to send data say every 10 minutes and thus feed it from a button cell.
Obviously, not only temperature or humidity data can be send but one can have an array of small transmitters sending soil moisture readings as well, or add an anemometer, or a rain meter

Step 5: Mini Weather Station: the Antenna

The antenna is an important part of any 433Mhz set up.
I have experimented with the standard 17.2 cm 'rod' antenna and had a short flirt with a coil antenna, What seemed to work best is a coil loaded antenna that is easy to make. The design is from Ben Schueler and apparently was published in 'Elektor' magazine. A PDF with the description of this 'Air cooled 433 MHz Antenna' is easy to follow

Step 6: Adding a BMP180

Want to add barometric pressure sensor like the BMP180? check my other instructable on that.

3 People Made This Project!

Recommendations

  • Audio Contest 2018

    Audio Contest 2018
  • Electronics Tips & Tricks Challenge

    Electronics Tips & Tricks Challenge
  • Optics Contest

    Optics Contest

173 Discussions

0
None
Sam1ive

1 year ago

Hi guys! help please, can't send the code for the button with the Attiny 13. what did I do wrong, the code compiles but no action happens(( how can I improve? is it possible to feed from the batteries with sleep mode attiny to last longer worked?

?Here is the code for the Arduino and it works great:

?=====================================

?#include <RCSwitch.h>

int button = 12;

RCSwitch mySwitch = RCSwitch();

void setup() {

Serial.begin(9600);

// Transmitter is connected to Arduino Pin #10

mySwitch.enableTransmit(10);

pinMode(button, INPUT);

}

void loop() {

if(digitalRead(button) == HIGH){mySwitch.send(11235377, 24);}

delay(500);

}

?============================================

?And this is the code for Attiny 13, the code is loaded but no action, help to fix the problem

?

?===============================================

#include <RCSwitch.h>

#include <avr/io.h>

#include <util/delay.h>

int button = 3;

RCSwitch mySwitch = RCSwitch();

int main( void ) {

// Transmitter is connected to Arduino Pin #0 (PB0)

mySwitch.enableTransmit(0);

pinMode(button, INPUT);

}

void loop() {

if(digitalRead(button) == LOW){mySwitch.send(11235377, 24);}

_delay_ms(500);

}

?===============================================

?

2017-01-28_115047.jpg
1 reply
0
None
diy_blokeSam1ive

Reply 1 year ago

I replied this in my other instructable where u asked this

0
None
nfarrow

2 years ago

Wonder if anyone has tried using a esp8266 for the same project.

10 replies
0
None
55ca40f5nfarrow

Reply 2 years ago

I was just thinking the same question. I think that the issue with the ESP8266 is the power draw. Although you can Sleep the ESP8266, I have seen posts claiming that there are issues with a stand-alone ESP8266 reconnecting to the DHTxx sensors on Waking. Using the Tiny85 to run Code might alleviate this issue. I would be interested to hear if anyone has any success.

0
None
saxondale55ca40f5

Reply 1 year ago

I have done this successfully on the ESP8266 with the Dallas DS18B20 sensor and it works fine when waking from a WiFi.forceSleepBegin(). This seems to extend battery life a lot, I have avoided to the full on deep sleep for now (had some problems with a dodgy sketch I uploaded that put it into deepsleep to quickly and I the struggled to upload a new sketch).

0
None
nfarrow55ca40f5

Reply 2 years ago

If you do create it I would love to see an instructable. I has a few of these ESP8266 and nrf24l01.

nrf24l01.png
0
None
Olav AlexanderMnfarrow

Reply 2 years ago

Look for nodemcu for a "all in one" sollution :-) Check out banggood, aliexpress etc. some few dollars.. you can also buy a shield.. Beware that different hw designs exist :-)

0
None
diy_bloke55ca40f5

Reply 2 years ago

correct. Have seen an esp8266 read a DHT11, no problem but forget abt batteries

0
None
Olav AlexanderMnfarrow

Reply 2 years ago

Sure you can, I have used ESP8266 for DHT22 and many other sensors.
You can also make it send data to thingspeak directly :-)

Sensors I've used on esp8266:
* Light sensor
* Sound sensor (microphone)
* DHT22, DHT11
* Dust sensor (Sharp)
+++

I've also used oled ( https://github.com/olikraus/u8glib), not all oled libs work.
PS. you might have to buy or create logic level converters for some sensors.

0
None
bsmith5nfarrow

Reply 2 years ago

I'd be tempted to try. Never had much luck with RF! I'd also make a fleet of these things, powered by coin cells - then have them in each room of my house...

0
None
diy_blokeStephen LEE

Reply 1 year ago

Thank you. Honestly though before making this, consider an esp8266 that sends it directly to a webpage.

0
None
a1m918

2 years ago

I am having errors while compiling example code of RadioHead, VirtualWire and

Manchester library.

I am using ATtiny13a. I searched a lot but no luck. any suggestions ?
Error with VirtualWire lib : 'TCCR1A' was not declared in this scope

Error with RadioHead lib: error: 'DORD' was not declared in this scope

Error with Manchester lib : #error "Manchester library only supports 8mhz, 16mhz on ATMega328"

these are just line no. 1 of errors.

Will appreciate any help ! :)

Thanks. :)

3 replies
0
None
diy_blokea1m918

Reply 2 years ago

I think the errormessages already give you all the help you need. The Manchester library only supports 8 and 16 MHz. The attiny13A supports 4.8 and 9.6 Mhz.
The TCCR1A and DORD refers to registers the 13A doesnt have.
It will work on an Attiny85 though

0
None
a1m918diy_bloke

Reply 2 years ago

Yes. 13a is limited. and with unusual frequency Manchester can't work. is there any way that I can make it work using some older versions of library and cores ? I am not sure It's just my guess.

thank you !?

0
None
diy_blokea1m918

Reply 2 years ago

no, older cores and libraries will not magically make it work. I gave a link on yr orangeboard to a program that supposedly does work

0
None
Electro-maniac

2 years ago

Hi. I’m struggling to send the information wirelessly.

I have made the full circuit and if I bridge the transmitters pin 5 and the receivers pin 6 together with a wire it works fine, so the Manchester library is working fine.

I set up a simple wireless button and LED circuit with the transmitter and receiver modules and that works fine too.

It just doesn’t work if I try and use the wireless modules to send the data from one Attiny85 to the other.

Any suggestions?