ESP8266 sensorius temperatūrai, drėgmei ir slėgiui stebėti - v0.1
Iš turimų Aliexpress komponentų greitu būdu sujungiau kelis sensorius. Padėjau rūsy ir bute. Čia surašau kaip viską dariau.
Tikslas
Pasidarė įdomu kokia temperatūra ir drėgmė rūsy skirtingais metų laikais. Noriu ten pasidaryti mini dirbtuves - reikia nuspręsti dėl papildomo vėdinimo ir (ap)šildymo.
Naudojami senų Nokia telefonų akumuliatoriai. Kad nereikėtų dažnai krauti, sensorius miegantis - pabunda kas 10 min, išsiunčia parametrus ir vėl užmiega.
Parametrai - akumuliatoriaus būklė, temperatūra, drėgmė ir slėgis - siunčimi MQTT protokolu į namų NAS serveriuką - QNAP TS-253A. Internete daug pavyzdžių kaip tam panaudoti Raspberri Pi, bet su Qnap daug paprasčiau - pasirenki reikiamus servisus ir aktyvuoji. Apie tai atskiru postu.
Naudojami komponentai
- ESP8266 ESP-12-F moduliai
- BME280 modulis - tikslus temperatūros, drėgmės ir slėgio sensorius sukurtas Bosch
- 2.2k ir 8k varžos įtampos dalinimui
- 5V 1A TP4056 akumuliatoriaus krovimo modulis
- BL-5B akumuliatorius
BL-5B mėtėsi stalčiuje - prikėliau dar vienam pagyvenimui prieš utilizuojant. Kitą kart naudosiu brangesnius ir talpesnius 3.7V 3400MAh 18650.
Jungimo Schema
Programavimas
Sensoriaus programavimui naudoju Micropython.
main.py
print("[INFO] main.py")
from machine import Pin, I2C, RTC, ADC, reset_cause, deepsleep, DEEPSLEEP, DEEPSLEEP_RESET
# import machine
import bme280
import utime
# from umqtt.robust import MQTTClient
from umqtt.simple import MQTTClient
if reset_cause() == DEEPSLEEP_RESET:
print(b'[INFO] woke from a deep sleep')
else:
print(b'[INFO] power on or hard reset')
device_id = "sensor02"
mqtt_server_ip = "192.168.88.69"
def connect_mqtt():
global client
global device_id
global broker_ip
client = MQTTClient(device_id, mqtt_server_ip)
# client.DEBUG = True
client.connect(clean_session=False)
connect_mqtt()
i2c = I2C(sda=Pin(4), scl=Pin(5))
bme = bme280.BME280(i2c=i2c)
adc = ADC(0)
while True:
# print/send temperature values
# print("[INFO] publishing...")
print(bme.values)
temperature, pressure, humidity = bme.values
# temperature = "{:.1f}".format(data[0])
adc_value = str( adc.read() )
voltage = "{}".format( round(3.27 / 713 * adc.read(), 2) )
# print("adc_value:", adc_value)
print("voltage:", voltage)
client.publish(b"stat/sensor02/temp", str(temperature))
# client.publish(b"stat/sensor02/pres", str(pressure))
client.publish(b"stat/sensor02/hum", str(humidity))
client.publish(b"stat/sensor02/v", str(voltage))
# client.publish(b"stat/sensor02/heap", str(gc.mem_free()))
print("[INFO] stopping for 10s ...")
utime.sleep(10) # number of seconds between each Publish
print("[INFO] deep sleeping...")
# configure RTC.ALARM0 to be able to wake the device
rtc = RTC()
rtc.irq(trigger=rtc.ALARM0, wake=DEEPSLEEP)
rtc.alarm(rtc.ALARM0, 1000 * 60 * 10)# fire after 10 mins
deepsleep()
Nuorodos
- Minimalus ESP-8266 jungimas http://www.areresearch.net/2015/12/espressif-esp-8266-minimal.html
- Jungimo rekomendacijos, režimai ir kita naudinga info https://arduino-esp8266.readthedocs.io/en/latest/boards.html
- Deep Sleep, Micropython http://docs.micropython.org/en/latest/esp8266/quickref.html#deep-sleep-mode