The WiFi Weather Sensor is a tiny weather station based on the ESP8266 SOC. It will push the measured temperature, humidity, pressure and battery voltage to the cloud or local servers in defined intervals. Configuration is done by using a simple web browser.
The sensor can be powered using a standard USB power supply or any batteries with a voltage of 3.5 to 6.5V. If inactive, the sensor will enter low power standby. A set of four AA batteries e.g. will last for about one month. The system will also switch off if the voltage drops below 3.0V to safe LiPo batteries. For recharging you might combine it with a solar charger.
Most of the components are available from Reichelt Elektronik, some more specific parts at Farnell, Mouser or Digikey. For the ESP-12 (PCB antenna only) or ESP-07 module (PCB antenna + U.FL connector) have a look at eBay or Aliexpress.
As temperature / humidity sensor either SHT11/SHT15 (more accurate) or AM2302/DHT22 (lower price) are possible. The connected sensor is detected automatically. Barometric pressure is measured by using the MS5637 sensor. (Or BMP180 on v1 circuit board)
Here's a list of all components: Bill of materials (PDF)
The circuit board is double-sided and plated-through. Because of that i'll recommend ordering it from a PCB manufacturer. Gerber files are included in the GIT repository. Possible good value PCB fabs are OSH-Park (USA), Itead-Studio (China) or Dirty Cheap Circuit Boards (China).
The design is already uploaded to OSH Park, just order it here:
WiFi Weather Sensor (Version 2) Circuit Board
WiFi Weather Sensor (Version 1 rev. D) Circuit Board
The LDO IC3 regulates the battery voltage down to 3.3V for power supply of the whole system. Battery voltage is monitored through the voltage divider R7 / R8 which is switched on by FET T2 only during measurement to reduce power consumption. The barometric pressure sensor MS5637 (IC4) and temperature / humidity sensor SHT11 (IC5) are connected to the ESP8266 module IC2 via I²C bus. Alternatively the temperature / humidity sensor AM2302/DHT22 (IC1) can be used. It is connected using a single wire bus. Status LED (D2) and a setup button (S1) are connected directly to the WiFi module. R3 is used as pull-up resistor for the button, R2 for the reset pin. In low power standby mode XPD_DCDC (GPIO16) is pulled low on wakeup timer event. I've connected it to the reset pin through a shottky diode (D1), because otherwise GPIO16 seemed to be at high level and there was a few ten milliamps of current flowing during reset if flashed via serial connection.
The top side (except for the SHT11 sensor) is soldered in a reflow oven. Just apply solder paste through a CNC cut stencil and bake the board with the appropriate temperature profile. If you don't own a reflow oven, a hot air soldering station might work, too.
The bottom side is assembled using a conventional soldering iron. It's the best practice to start with the smallest components first. If the sensor should run on batteries, don't forget to remove the red LED from the ESP8266 module.
All ESP8266 modules have a pre-installed bootloader which allows simple firmware flashing via serial connection. A 3.3V TTL USB serial adapter is needed. I recommend those with FT232 chipset.
Connect the pin header of the board to the serial adapter as follows:
Weather sensor | Serial adapter |
---|---|
TXD | TXD |
RXD | RXD |
RST | RTS |
GP0 | DTR |
GND | GND |
If you don't want to modify the firmware, you might skip the next steps and flash the precompiled firmware.
First we will install all necessary packages to compile the toolchain. On a minimal Fedora 26 Linux use the following commands:
sudo dnf install make autoconf automake libtool gcc gcc-c++ gperf flex bison texinfo gawk ncurses-devel expat-devel python pyserial python-devel sed git unzip wget bzip2 patch help2man
sudo dnf install http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm
sudo dnf install http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
sudo dnf install unrar
If you are using Debian or Ubuntu Linux, just have a look at the toolchain documentation for installing the needed packages. After that you may continue as described below.
Now we're ready to download and compile the ESP8266 toolchain. This process may take a few minutes, depending on your Internet connection and CPU speed, so you better get yourself a cup of tea (or coffee).
git clone --recursive https://github.com/pfalcon/esp-open-sdk.git
cd esp-open-sdk
make
cd ..
If no errors have occurred, we are ready to finish the installation. I prefer moving the toolchain out of my home directory to /opt, but you may also leave it there and change the paths in the environment variables.
sudo mv esp-open-sdk /opt/esp-open-sdk
Open your .bashrc
file with your favorite editor and add the following lines at the end of the file:
export PATH=/opt/esp-open-sdk/xtensa-lx106-elf/bin:$PATH
export XTENSA_TOOLS_ROOT=/opt/esp-open-sdk/xtensa-lx106-elf/bin/
export SDK_BASE=/opt/esp-open-sdk/sdk
export ESPTOOL=/opt/esp-open-sdk/esptool/esptool.py
export ESPPORT=/dev/ttyUSB0
The changes take effect after a new shell is opened, so log out or open a new terminal window.
yui-compressor is written in Java, so we'll need to install the Java package:
sudo dnf install java
If you are using Debian or Ubuntu Linux instead of Fedora, install the OpenJDK JRE.
Now download the precompiled .jar file to a folder and also copy it to /opt:
mkdir yuicompressor
wget https://github.com/yui/yuicompressor/releases/download/v2.4.8/yuicompressor-2.4.8.jar
mv yuicompressor-2.4.8.jar yuicompressor/yuicompressor.jar
sudo mv yuicompressor /opt/yuicompressor
A small wrapper script is needed to execute yui-compressor
from the makefile
. Open it with your favorite editor by typing:
sudo vi /usr/bin/yui-compressor
And add the following lines:
#!/bin/sh
java -jar /opt/yuicompressor/yuicompressor.jar $*
Now make the script executable:
sudo chmod +x /usr/bin/yui-compressor
Just clone this repository and change into its directory:
git clone https://github.com/MalteP/espweather.git
cd espweather
cd firmware
Compile the firmware by typing make
.
make
Flash firmware and filesystem partition by typing:
make flash
make htmlflash
If the serial port is not /dev/ttyUSB0, you may add (for example) ESPPORT=/dev/ttyUSB1
to both make
commands or change your environment variables.
If the firmware is running, the orange LED on the board should start flashing.
If the blue LED is constantly flickering, there might be a problem with the calibration data which is stored in flash memory. The position depends on the size of flash determined from the firmware header. Just flash the default calibration data again:
make defaultflash
After cycling power of the board, the firmware should run fine. The precompiled binary includes calibration data at the correct position.
If you don't want to compile the firmware yourself, just skip all "Building the firmware" steps above.
You might use NodeMCU Flasher on Windows to flash the precompiled binaries. Open it, change to the "Config" tab and choose the firmware binary by clicking the gear-wheel button. Click the drop-down list on the right side to select the flash section 0x00000. Change back to the "Operation" tab, select the COM port your serial adapter is connected to, and click the "Flash" button.
There are two modes inside the firmware, normal mode and configuration mode. In normal mode the sensor will measure and push data to the cloud. In configuration mode the sensor acts as wireless access point and is configured via a standard web browser.
The sensor will measure temperature, humidity, barometric pressure and battery voltage and push these values to the configured server. After that it will enter deep sleep standby. At the first start after the battery has been connected, the sensor will stay active for one minute. You may press the button for 3-4sec to switch to configuration mode.
The status is shown by the orange LED, flashing in 1s intervals
no. of flashes | Status |
---|---|
1x | Waiting for WiFi / DHCP |
2x | Push data |
3x | Server error |
4x | First start, waiting |
In configuration mode the orange LED will blink at 1Hz clock. Use your computer to connect to the WiFi ESP_xxxx (no encryption) and open http://192.168.4.1/ in your browser. It will show measured values on the main page, but they may not be very accurate because the WiFi module will heat up the sensors. (This won't affect normal mode because the sensor is only active for ~20sec and will "cool down" during standby periods!) To leave configuration mode, hold the button for 3-4sec. To erase all configuration data, hold the button for about 10sec.
Click on the button "Settings" at the top right side. The default username is "admin" with password "insecure".
Hint: If you'd like to use an encrypted configuration WiFi, just uncomment the WIFI_PASS definition in user/config.h before compiling.
Just choose the WiFi you want to connect to and enter the password if it is encrypted. It might be useful to set up a guest network in your router for security reasons.
On the sensor settings tab, you may change the interval the sensor data is pushed to HTTP and / or MQTT servers. Per default this is set to 300sec (5min).
As cloud services Thinkspeak and adafruit.io are available. It is also possible to use a custom URL with placeholders which are replaced by measured values.
Placeholder | Value |
---|---|
%t | Temperature |
%h | rel. Humidity |
%p | Barometic pressure |
%v | Battery voltage |
%r | WiFi signal strength |
If you like to use MQTT, just setup a server software like mosquitto and configure host, port, user and password. The sensor will publish data on [topic]/temperature, /humidity, /pressure, /voltage and /rssi. Different clients may subscribe and receive data immediately after it is published.
You may change the default username and password for configuration login here.
This shows some nice information about the sensor and code used.
The firmware is released under the terms of GNU GPL v3, circuit board is licensed CC BY-NC-SA.