StofAnanas: Difference between revisions
Line 30: | Line 30: | ||
=== Next generation === | === Next generation === | ||
The next generation will work as follows: | The next generation will work as follows: | ||
* protocol is ESP-NOW between roles 'lamp' and 'dust sensor', both can be ESP8266 | * The protocol is ESP-NOW between roles 'lamp' and 'dust sensor', both can be ESP8266. This does not require credentials (like WEP/PA) to be entered. | ||
* | * On startup, the lamp sends broadcast discovery messages at a regular interval, say every three seconds, it flashes blue while doing so. | ||
* dust sensor receives broadcast message, remembers the lamp MAC and id sent | * The dust sensor receives the broadcast discovery message, sends a unicast message back and remembers the lamp MAC and id sent from the discovery message. | ||
* lamp receives the unicast message, this means that discovery is complete, stops flashing blue | * The lamp receives the unicast message, this means that discovery is complete, it stops flashing blue. | ||
* dust sensor sends measurement/color code unicast message to lamp when a measurement is | * The dust sensor sends measurement/color code unicast message to lamp when a measurement is made, the lamp shows the associated color. | ||
The data format is JSON, human readable, extensible. Not so friendly on data size, but we can send up to 250 bytes. | The data format is JSON, human readable, extensible. Not so friendly on data size, but we can send up to 250 bytes. | ||
Line 48: | Line 48: | ||
{"msg":"data","PM10":12.3,"PM2.5":8.4,"PM1.0":4.5,"humidity":42.5,"temperature":14.3,"pressure":102511,"color":"#11FF00"} | {"msg":"data","PM10":12.3,"PM2.5":8.4,"PM1.0":4.5,"humidity":42.5,"temperature":14.3,"pressure":102511,"color":"#11FF00"} | ||
The lamp can decide for itself what to do: just display the color, or calculate it from the measurement. | The lamp can decide for itself what to do: just display the color, or calculate it from the measurement. | ||
== Building it == | == Building it == |
Revision as of 12:52, 22 October 2020
Project StofAnanas | |
---|---|
Showing particulate matter concentration as a coloured light | |
Status | In progress |
Contact | bertrik |
Last Update | 2020-10-22 |
The concept
The stofananas/stoflama visualizes the current airborne particulate matter concentration from the nearest luftdaten measurement station, inspired by http://stoflamp.nl The data that the LED colour is based on is retrieved over WiFi from the luftdaten website every 5 minutes.
This lamp is a soft plastic translucent pine apple ("ananas") or lama, bought at the "Action" store.
Features:
- The lamp shows PM10 particulate matter concentration as a colour, from dark blue for low concentration to bright pink for high concentration
- The lamp retrieves the PM value over wifi from the the luftdaten website, there is a one-time setup to configure your WiFi network so the device can access the internet
- The lamp automatically determines the nearest luftdaten particulate measurement station, by doing WiFi-based geolocation.
- The number/id of the luftdaten station can also be entered manually during the one-time setup.
- The hardware consists of a Wemos D1 mini board (about E3,-), a LED shield and a USB power supply + cable.
- The software supports two different kinds of Wemos D1 mini LED "shield", both the shield with a single LED and the shield with 7 LEDs arranged in a star.
Ideas/nice to have:
- Built-in web server, with links to historic measurement data of the sensor it's monitoring, link to google maps, etc.
- complication: the nice graphs on madavi.de are based on the *hardware id* (not database id), we can't get that automatically
- just show a table with all properties in the left column (PM values, WGS84 location) and their values in the right column?
- some kind of compatibility mode with the stoflamp from stoflamp.nl
- Run the software directly on a WiFi-enabled E14 RGB lamp from the Action store. This lamp has the microcontroller already built in. No separate USB power adapter is needed, it runs directly off 230V. See the WifiLamp project.
Next generation
The next generation will work as follows:
- The protocol is ESP-NOW between roles 'lamp' and 'dust sensor', both can be ESP8266. This does not require credentials (like WEP/PA) to be entered.
- On startup, the lamp sends broadcast discovery messages at a regular interval, say every three seconds, it flashes blue while doing so.
- The dust sensor receives the broadcast discovery message, sends a unicast message back and remembers the lamp MAC and id sent from the discovery message.
- The lamp receives the unicast message, this means that discovery is complete, it stops flashing blue.
- The dust sensor sends measurement/color code unicast message to lamp when a measurement is made, the lamp shows the associated color.
The data format is JSON, human readable, extensible. Not so friendly on data size, but we can send up to 250 bytes. The dust sensor can show in its internal web page that a lamp was found and can display the lamp id.
Example broadcast discovery packet (lamp to dust sensor):
{"msg":"discover","id":"PMLAMP-1A543C"}
Example unicast discovery response packet (dust sensor to lamp):
{"msg":"associate","id":"ESP-5CCF7F8B6DC4"}
Example unicast measurement/color packet (dust sensor to lamp):
{"msg":"data","PM10":12.3,"PM2.5":8.4,"PM1.0":4.5,"humidity":42.5,"temperature":14.3,"pressure":102511,"color":"#11FF00"}
The lamp can decide for itself what to do: just display the color, or calculate it from the measurement.
Building it
It consists of a few parts:
- a Wemos D1 mini board
- a LED shield, either the one with 1 LED, or the one with 7 LEDs (preferred, brighter)
- a 5V USB charger with stable voltage output + USB cable
- a plastic lamp enclosure
Steps:
- solder the female headers onto the Wemos D1 mini, start with soldering just one pin so you can re-heat it and adjust it if the fit with the male pins is not quite right.
- push the male headers into the female headers and solder the male headers onto the LED shield
- connect the USB micro cable and flash the firmware into the Wemos d1 mini board
- verify that it works as expected, on startup it does a quick colour animation, starting and ending with the red colour
- remove the USB micro cable and push the Wemos d1 mini board + LED shield into the plastic enclosure
- reattach the USB micro cable and verify it still works
It helps to make a few little knife cuts in the plastic of the enclosure to make the wemos d1 mini board fit more easily.
Operation Manual
Programming
- connect everything up as indicated under 'hardware' and connect the Wemos D1 board to the USB port of your development PC / laptop
- flash the software into the Wemos D1 mini, typically from the command line using platformio:
pio run -t upload
This assumes you have platformio installed, this is done on Debian Linux for example, as follows:
sudo apt install python-pip sudo pip install platformio
Configuration
Automatic configuration:
- power up the lamp
- on a mobile phone, connect to the "ESP-PMLAMP" network, and select login
- when presented with the captive portal, select a WiFi network, fill in the WiFi password, leave the luftdaten id field EMPTY, press SAVE
- the closest luftdaten particulate matter sensor will automatically be determined
Manual configuration:
- on https://netherlands.maps.luftdaten.info find the particulate matter station you want to follow and note the number of the station, for example "12246"
- on a mobile phone, connect to the "ESP-PMLAMP" network, and select login
- when presented with the captive portal, select a WiFi network, fill in the WiFi password, AND ALSO fill in the number you looked up earlier, press SAVE
Alternatively:
- make sure at least the WiFi credentials have been entered and saved
- open a console to the serial port of the wemos D1 mini (115200 bps) and enter the following command:
config auto
- within a few seconds, you should see it prints the current approximate geographic location and the id of the luftdaten station, the id should be non-zero. It is saved in internal memory.
Usage
- Power up the lamp while in range of the WiFi network you configured. The LED shows a colour animation when starting up (starting with red and ending with red)
- The LED turns white for a short time, then changes to a colour representing a PM concentration
- A new PM measurement is retrieved automatically every 5 minutes.
- A flashing colour (1x per second) means that something went wrong, either communication with the luftdaten server or decoding the luftdaten server response
Hardware
The electronic part consists of a Wemos D1 mini board and a LED shield.
The LED can be one of these LED shields:
- 1-LED shield: https://wiki.wemos.cc/products:d1_mini_shields:ws2812b_rgb_shield
- 7-LED shield: https://wiki.wemos.cc/products:d1_mini_shields:rgb_led_shield
The 7-LED shield is a lot brighter than the 1-LED shield.
Unfortunately not all LED shields are equal, some contain an RGB LED, others have the RGB colours switched. During startup, the colour animation should start and end with the RED colour.
Software
Getting and building the source code
Source code is available on github.
To compile and upload it, I use platform io:
pio run -t upload
You can also compile it with the Arduino IDE, libraries used:
- ArduinoJSON (v 6.15.2) for parsing the luftdaten response
- FastLED (v 3.3.3) is used to control the RGB LED
- WiFiManager (v 0.15.0) is used to manage WiFi connection to the local AP
Luftdaten interface
The current measurement value of a particular sensor can be determined by parsing the JSON messages retrieved over a REST interface, by performing an HTTP GET on URL
http://api.luftdaten.info/v1/sensor/<sensor-id>/ http://data.sensor.community/airrohr/v1/sensor/<sensor-id>/
where <sensor-id> is the database id used by luftdaten (and visible on their map). The trailing slash in the URL is significant.
For example:
http://api.luftdaten.info/v1/sensor/12246/ http://data.sensor.community/airrohr/v1/sensor/12246/
The software looks for the "P1" (PM10) sensor value in the JSON message and averages all measurements it finds (usually the current one and a previous one).
Colour mapping
Mapping is as follows, with piecewise linear interpolation:
- 0 ug/m3: deep blue
- 15 ug/m3: green
- 30 ug/m3: yellow
- 60 ug/m3: red
- 120+ ug/m3: pink