toc PyNode+ Air Examples more_vert What's in this document more_vert Tutorials & Examples > PyNode+ > PyNode+ Air

PyNode+ Air Examples

You can use the following code to query the PyNode+ Air sensor from MicroPython

from network import Bluetooth
import time
import ubinascii
import struct
bt = Bluetooth()
bt.start_scan(-1)

def twoscmp(value):
    if value > 128:
        value = value - 256
    return value

while True:
    adv = bt.get_adv()
    if adv:
        read_adv = bt.resolve_adv_data(adv.data, Bluetooth.ADV_MANUFACTURER_DATA)
        if read_adv==None:
            pass
        else:
            manuf = ubinascii.hexlify(read_adv)
            manuf_data = ubinascii.hexlify(read_adv[0:4])
            if manuf_data == b'4c000215': # ibeacon
                print(ubinascii.hexlify(adv.mac))
                uuid = ubinascii.hexlify(read_adv[4:20])
                major = ubinascii.hexlify(read_adv[20:22])
                minor = ubinascii.hexlify(read_adv[22:24])
                tx_power = ubinascii.hexlify(read_adv[24:25])
                tx_power_real = twoscmp(int(tx_power, 16))
                major_int = int(major, 16)
                major_f = float(-45 + 175*major_int/65536)
                minor_int = int(minor,16)
                minor_f = float(100*minor_int/65536)
                print("uuid:",ubinascii.unhexlify(uuid), " rest:", major, minor)
                print("temperature:",major_f, "humidity:", minor_f)
                print("")
    else:
        time.sleep(0.050)

The below code can be used to modify the sleep duration.

import time
import ubinascii
import struct

def get_adv_int(arg):
    time_msec = {
         100: b'\x01', # 100ms
         200: b'\x02', # 200ms
         500: b'\x05', # 500ms
        1000: b'\x10' # 1000ms
    }
    return time_msec.get(arg, b'\x00') # default is 1000ms

def get_adv_dur(arg):
    time_sec = {
         1: b'\x01', # 1 hour
         2: b'\x02', # 3 hours
         3: b'\x03', # 6 hours
         4: b'\x04', # 11 hours (max)
         5: b'\x05' # 10 secs
    }
    return time_sec.get(arg, b'\x00') # default is 10 secs

def get_sleep_dur(arg):
    time_sec = {
        10: b'\xFF', # 10 secs
         3: b'\x03', # 3 secs
        20: b'\x20', # 20 secs
        30: b'\x30', # 30 secs
        11: b'\x11', # 1 hour
        33: b'\x33', # 3 hours
        66: b'\x66', # 6 hours
        1111: b'\xBB' # 11 hours (max)
    }
    return time_sec.get(arg, b'\x00') # default is 5 secs

def change_adv(adv_int, adv_dur, sleep_dur):
    from network import Bluetooth
    bt = Bluetooth()
    bt.start_scan(10)
    last_time = time.time()
    print("scanning |", end="")
    while (time.time()-last_time)<10:
        print("\b\\", end="")
        time.sleep(0.050)
        print("\b-", end="")
        time.sleep(0.050)
        print("\b|", end="")
        time.sleep(0.050)
        print("\b/", end="")
        time.sleep(0.050)
        adv = bt.get_adv()
        if adv and bt.resolve_adv_data(adv.data, Bluetooth.ADV_NAME_CMPL) == 'PyNode Air':
            try:
                conn = bt.connect(adv.mac)
                services = conn.services()
                for service in services:
                    u = service.uuid()
                    time.sleep(0.50)
                    if isinstance(u, int):
                        pass
                    else:
                        if ubinascii.hexlify(u) == b'595a08e4862a9e8fe911bc7c7c464218':
                            chars = service.characteristics()
                            for char in chars:
                                c_uuid = char.uuid()
                                descriptor = char.read_descriptor(0x2901)
                                print("")
                                print(descriptor.decode('utf-8'),end=" ")
                                c_hex = ubinascii.hexlify(c_uuid)
                                if c_hex == b'23ee8d0ce1f04a0cb325dc536a68862d': # sleep duration
                                    print("is changed to:", sleep_dur,"sec")
                                    value = get_sleep_dur(sleep_dur)
                                    char.write(value)
                                elif c_hex == b'25ee8d0ce1f04a0cb325dc536a68862d': # advertising duration
                                    print("is changed to:", adv_dur,"sec")
                                    value = get_adv_dur(adv_dur)
                                    char.write(value)
                                elif c_hex == b'22ee8d0ce1f04a0cb325dc536a68862d': # advertising interval
                                    print("is changed to:", adv_int,"ms")
                                    value = get_adv_int(adv_int)
                                    char.write(value)
                                else:
                                    print(" ")
                conn.disconnect()
                break
            except Exception as e:
                print(e)
                if conn:
                    conn.disconnect()
                bt.deinit()
                print("Error while connecting or reading from the BLE device")
                break
        else:
            time.sleep(0.050)

 

Previous Next