station-meteo/code/main.py

85 lines
2.9 KiB
Python

"""Station météo connectée au service Adafruit IO
"""
import time
import machine
import network
import bme280_i2c
from mqtt import MQTTClient
import config
# connect to WLAN
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
nets = wlan.scan()
for net in nets:
net_ssid = net[0].decode()
if net_ssid == config.WIFI_SSID:
print('Network found!')
wlan.connect(net_ssid, config.WIFI_PSK)
while not wlan.isconnected():
machine.idle() # save power while waiting
print('WLAN connection succeeded!')
break
if not wlan.isconnected():
print("WLAN not found/not connected")
# Create a micropython I2C object with the appropriate device pins
i2c = machine.I2C(scl=machine.Pin(5), sda=machine.Pin(4))
# Create a sensor object to represent the BME280
# Note that this will error if the device can't be reached over I2C.
bme = bme280_i2c.BME280_I2C(address=bme280_i2c.BME280_I2C_ADDR_SEC, i2c=i2c)
# Configure the sensor for the application in question.
bme.set_measurement_settings({
'filter': bme280_i2c.BME280_FILTER_COEFF_16,
'standby_time': bme280_i2c.BME280_STANDBY_TIME_500_US,
'osr_h': bme280_i2c.BME280_OVERSAMPLING_1X,
'osr_p': bme280_i2c.BME280_OVERSAMPLING_16X,
'osr_t': bme280_i2c.BME280_OVERSAMPLING_2X})
# Start the sensor automatically sensing
bme.set_power_mode(bme280_i2c.BME280_NORMAL_MODE)
client = MQTTClient(client_id=config.CLIENT_ID,
server=config.MQTT_HOST,
user=config.MQTT_USERNAME,
password=config.MQTT_PASSWD,
port=config.MQTT_PORT)
client.connect()
client.publish("test/bme280/humidity/unit", "%", retain=True, qos=0)
client.publish("test/bme280/humidity/desc", "Capteur Bosch BME280", retain=True, qos=0)
time.sleep_ms(100)
client.publish("test/bme280/pressure/unit", "hPa", retain=True, qos=0)
client.publish("test/bme280/pressure/desc", "Capteur Bosch BME280", retain=True, qos=0)
time.sleep_ms(100)
client.publish("test/bme280/temperature/unit", "degC", retain=True, qos=0)
client.publish("test/bme280/temperature/desc", "Capteur Bosch BME280", retain=True, qos=0)
time.sleep_ms(100)
client.publish("test/esp8266_0/wifi/ssid", config.WIFI_SSID, retain=True, qos=0)
client.publish("test/esp8266_0/wifi/ip", wlan.ifconfig()[0], retain=True, qos=0)
time.sleep_ms(1000)
# For each nature, a list describe:
# - mqtt topic
# - string format
# - factor (multiplier)
topics = {"humidity" : ["test/esp8266_0/humidity/value", "{:.0f}", 1],
"pressure" : ["test/esp8266_0/pressure/value", "{:.2f}", 0.01],
"temperature" : ["test/esp8266_0/temperature/value", "{:.1f}", 1]}
while 1:
bme_data = bme.get_measurement()
print(bme_data)
for nature, param in topics.items():
client.publish(param[0], param[1].format(bme_data[nature]*param[2]))
client.publish("test/esp8266_0/wifi/rssi", "{:.0f}".format(wlan.status('rssi')))
time.sleep_ms(1000)