Reading GATT Data from Xiaomi Flower Care

All ESP32 boards running MicroPython.
Target audience: MicroPython users with an ESP32 board.
JohnN
Posts: 8
Joined: Sat Jan 25, 2020 11:05 am

Reading GATT Data from Xiaomi Flower Care

Post by JohnN » Sat Jan 25, 2020 11:25 am

Hi everonye,

I wrote a little python script for my PC that reads the GATT information from a Xiaomi Flower Care with the bluez API on Linux. But it is very unreliable and not well written. I would usually just start the script and get the results printed to the shell.

I bought two different esp32 to try and read the data with micropython. I flashed esp32spiram-idf4-20191220-v1.12.bin and rshell seems to work. To get to my goal, I have several things to understand and would appreciate if you could help me along the way.

First I try to understand how running code on the micropython esp32 works. I created a main.py file and added these lines:

Code: Select all

/pyboard> cat main.py
import network
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.scan()                             
sta_if.connect("SSID", "Password") 
sta_if.isconnected()
which works without a problem in the rshell repl:

Code: Select all

>>> import network
>>> sta_if = network.WLAN(network.STA_IF)
>>> sta_if.active(True)
True
>>> sta_if.connect("SSID", "Password")
>>> sta_if.isconnected()
True
>>> sta_if.ifconfig()
('192.168.34.152', '255.255.255.0', '192.168.34.1', '192.168.34.1')
but when I try to run sta_if.ifconfig() in the repl after turning on the power of the esp32 I get

Code: Select all

>>> sta_if.ifconfig()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'sta_if' isn't defined
Does this mean the main.py did not run, or does it mean the wifi connection was closed again right after main.py ran?

JohnN
Posts: 8
Joined: Sat Jan 25, 2020 11:05 am

Re: Reading GATT Data from Xiaomi Flower Care

Post by JohnN » Sun Jan 26, 2020 9:39 am

I assume once the script is done, everything is reset back to where it was. I have no prove but changing main.py to this:

Code: Select all

import network
import time

sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect("SSID", "Password") 
time.sleep(10)

with open("test.txt", "a") as myfile:
    myfile.write("network config: " + sta_if.ifconfig()[0]+ " " + sta_if.ifconfig()[1]+ " " + sta_if.ifconfig()[2]+ " " + sta_if.ifconfig()[3]+ "\n")
    myfile.close()
worked to write the status into a file.

The next point on my list is to get the BLE scanner up and running. As far as I understand this is done with Interrupts. I tried to get a very simple scanner up and running in the repl, but I did not get a response, any ideas what I may be missing?

Code: Select all

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:4988
load:0x40078000,len:11408
load:0x40080400,len:6108
entry 0x400806bc
I (601) psram: This chip is ESP32-D0WD
E (601) spiram: SPI RAM enabled but initialization failed. Bailing out.
I (601) cpu_start: Failed to init external RAM; continuing without it.
I (608) cpu_start: Pro cpu up.
I (612) cpu_start: Application information:
I (617) cpu_start: Compile time:     Dec 20 2019 07:58:58
I (623) cpu_start: ELF file SHA256:  0000000000000000...
I (629) cpu_start: ESP-IDF:          v4.0-beta1
I (634) cpu_start: Starting app cpu, entry point is 0x400835e0
I (0) cpu_start: App cpu up.
I (645) heap_init: Initializing. RAM available for dynamic allocation:
I (652) heap_init: At 3FFAFF10 len 000000F0 (0 KiB): DRAM
I (658) heap_init: At 3FFB6388 len 00001C78 (7 KiB): DRAM
I (664) heap_init: At 3FFB9A20 len 00004108 (16 KiB): DRAM
I (670) heap_init: At 3FFBDB5C len 00000004 (0 KiB): DRAM
I (676) heap_init: At 3FFCCA50 len 000135B0 (77 KiB): DRAM
I (682) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (688) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (695) heap_init: At 4009E2E4 len 00001D1C (7 KiB): IRAM
I (701) cpu_start: Pro cpu start user code
I (720) spi_flash: detected chip: generic
I (720) spi_flash: flash io: dio
I (720) cpu_start: Chip Revision: 1
W (722) cpu_start: Chip revision is higher than the one configured in menuconfig. Suggest to upgrade it.
I (732) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
E (40) spiram: SPI RAM not initialized
MicroPython v1.12 on 2019-12-20; ESP32 module (spiram) with ESP32
Type "help()" for more information.
>>> from micropython import const
>>> import bluetooth
>>> _IRQ_SCAN_RESULT                     = const(1 << 4)
>>> _IRQ_SCAN_COMPLETE                   = const(1 << 5)
>>> def bt_irq(event, data):
...     if event == _IRQ_SCAN_RESULT:
...         print("Result!")
...     elif event == _IRQ_SCAN_COMPLETE:
...         print("Complete!")
...        
...        
...
>>> bt = bluetooth.BLE()
>>> bt.active(True)
I (90520) BTDM_INIT: BT controller compile version [a482cda]
I (101256) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE
I (101366) phy: phy_version: 4102, 2fa7a43, Jul 15 2019, 13:06:06, 0, 0
GAP procedure initiated: stop advertising.
True
>>> bt.gap_scan(10000)
GAP procedure initiated: discovery; own_addr_type=0 filter_policy=0 passive=1 limited=0 filter_duplicates=0 duration=10000ms
>>>

User avatar
jimmo
Posts: 2754
Joined: Tue Aug 08, 2017 1:57 am
Location: Sydney, Australia
Contact:

Re: Reading GATT Data from Xiaomi Flower Care

Post by jimmo » Mon Jan 27, 2020 4:01 am

MicroPython retains no state across a power cycle, so you must re-initialize everything from scratch in main.py. (I think you've answered this yourself in your second post).

JohnN wrote:
Sun Jan 26, 2020 9:39 am
The next point on my list is to get the BLE scanner up and running. As far as I understand this is done with Interrupts. I tried to get a very simple scanner up and running in the repl, but I did not get a response, any ideas what I may be missing?
Yup, looks like you're on the right track, you just need to tell the BLE object what your handler function is by calling: ble.irq(handler=bt_irq)

https://github.com/micropython/micropyt ... central.py shows a more complicated example that involves scanning.

Btw, you might also find that you need to set the window and interval params if your devices are advertising slowly. The docs explain this in more detail: http://docs.micropython.org/en/latest/l ... E.gap_scan

JohnN
Posts: 8
Joined: Sat Jan 25, 2020 11:05 am

Re: Reading GATT Data from Xiaomi Flower Care

Post by JohnN » Mon Jan 27, 2020 5:44 pm

Hi Jimmo,

thanks for your reply, I tried the ble.irq(handler=bt_irq) and now it seems to work! :-D

Code: Select all

import bluetooth
import binascii
from micropython import const

_IRQ_SCAN_RESULT                     = const(1 << 4)
_IRQ_SCAN_COMPLETE                   = const(1 << 5)

def bt_irq(event, data):
  if event == _IRQ_SCAN_RESULT:
        addr_type, addr, connectable, rssi, adv_data = data
        print(data[0], binascii.hexlify(data[1]).decode(), data[2], data[3], binascii.hexlify(data[4]).decode())
  elif event == _IRQ_SCAN_COMPLETE:
        print("scan complete!")

bt = bluetooth.BLE()
bt.active(True)
bt.irq(handler=bt_irq)
bt.gap_scan(10000, 30000, 30000)
I am getting addr_type, addr, connectable, rssi and adv_data, here is a sample:

Code: Select all

1 0778c5d0cc71 False -78 02011b0bff4c000906038500000000
0 28ff3cb5232e True -86 02011a020a0c0aff4c00100501145c626a
0 28ff3cb5232e True -86 02011a020a0c0aff4c00100501145c626a
1 0778c5d0cc71 False -75 02011b0bff4c000906038500000000
0 28ff3cb5232e True -86 02011a020a0c0aff4c00100501145c626a
1 0778c5d0cc71 False -75 02011b0bff4c000906038500000000
1 402bdc621e8e True -94 02011a020a070bff4c0010062a1e7fca02ff
0 28ff3cb5232e True -86 02011a020a0c0aff4c00100501145c626a
1 0778c5d0cc71 False -75 02011b0bff4c000906038500000000
1 71f1c3ec4566 True -91 02011a020a180aff4c00100501186f0905
addr seems to be the mac address, connectable and rssi seem to be self explanatory, but what does addr_type and adv_data mean? Maybe the difference between bluetooth and bluetooth low energy? Can I read anything useful from adv_data? If not I would take the mac address and try to connect as a next step.

greetings,
John

User avatar
jimmo
Posts: 2754
Joined: Tue Aug 08, 2017 1:57 am
Location: Sydney, Australia
Contact:

Re: Reading GATT Data from Xiaomi Flower Care

Post by jimmo » Tue Jan 28, 2020 1:29 am

Great!

addr type is the type of address (public, etc) -- you'll need it if you want to connect to that device. (See http://docs.micropython.org/en/latest/l ... ap_connect )

adv_data is the device's advertising payload. which for a beacon is the beacon's data, and for regular devices is some basic info about the device (name, type, services, etc). See https://github.com/micropython/micropyt ... rtising.py for how to create/parse this data.

JohnN
Posts: 8
Joined: Sat Jan 25, 2020 11:05 am

Re: Reading GATT Data from Xiaomi Flower Care

Post by JohnN » Sat Feb 15, 2020 2:26 pm

Hi,

it took me some time, but I looked into my two xiamo flower care and this is what I got back:
0 | c47c8d66d6d8 | b'\xc4|\x8df\xd6\xd8' | True | -34 | 020106030295fe151695fe7120980006d8d6668d7cc40d071003000000
0 | c47c8d66ddf0 | b'\xc4|\x8df\xdd\xf0' | True | -50 | 020106030295fe131695fe7120980060f0dd668d7cc40d08100100

When I decode the advertisement data by hand I will get:
- for c47c8d66d6d8:
020106
030295fe
151695fe7120980006d8 d6668d7cc40d0710 03000000

- for c47c8d66ddf0:
020106
030295fe
151695fe7120980060f0 dd668d7cc40d0810 0100

The red byte shows me how long the following section is and the blue byte shows me what data type is following. Hence I have:
- «Flags»
- «Incomplete List of 16-bit Service Class UUIDs»
- «Service Data - 16-bit UUID»

According to this specification I can split the last part into the green and brown octets that form the 16 bit Service UUID followed by additional service data.

My question: what can I do with this Service Data UUID?
EDIT: I would like to check if this device is a xiaomi flower meter before connecting to it. I assume this will save battery life. I think i could hardcode the Service Data UUIDs but I would prefer a more generic approach. Maybe I will add other flower meters later.

User avatar
jimmo
Posts: 2754
Joined: Tue Aug 08, 2017 1:57 am
Location: Sydney, Australia
Contact:

Re: Reading GATT Data from Xiaomi Flower Care

Post by jimmo » Sat Feb 15, 2020 11:37 pm

JohnN wrote:
Sat Feb 15, 2020 2:26 pm
According to this specification I can split the last part into the green and brown octets that form the 16 bit Service UUID followed by additional service data.
See https://github.com/micropython/micropyt ... rtising.py for some basic parsing methods for this data (you should be able to use the decode_services method directly to get out the service UUIDs though).
JohnN wrote:
Sat Feb 15, 2020 2:26 pm
I would like to check if this device is a xiaomi flower meter before connecting to it.
Unless it tells you in its name or your can recognize the address (maybe some prefix of the address) I don't think there's a way to do this. The service list is supposed to be the way to show what capabilities it supports (without needing to do a full connection to list the services).

JohnN
Posts: 8
Joined: Sat Jan 25, 2020 11:05 am

Re: Reading GATT Data from Xiaomi Flower Care

Post by JohnN » Sun Feb 16, 2020 9:56 pm

Hi Jimmo, thanks for your reply, I did some further reading and it seems that I can use the service class ID.

I tried to follow through checking the characteristics with this code:

Code: Select all

import time
import bluetooth
import binascii
from micropython import const

_IRQ_CENTRAL_CONNECT                 = const(1 << 0)
_IRQ_CENTRAL_DISCONNECT              = const(1 << 1)
_IRQ_GATTS_WRITE                     = const(1 << 2)
_IRQ_GATTS_READ_REQUEST              = const(1 << 3)
_IRQ_SCAN_RESULT                     = const(1 << 4)
_IRQ_SCAN_COMPLETE                   = const(1 << 5)
_IRQ_PERIPHERAL_CONNECT              = const(1 << 6)
_IRQ_PERIPHERAL_DISCONNECT           = const(1 << 7)
_IRQ_GATTC_SERVICE_RESULT            = const(1 << 8)
_IRQ_GATTC_CHARACTERISTIC_RESULT     = const(1 << 9)
_IRQ_GATTC_DESCRIPTOR_RESULT         = const(1 << 10)
_IRQ_GATTC_READ_RESULT               = const(1 << 11)
_IRQ_GATTC_WRITE_STATUS              = const(1 << 12)
_IRQ_GATTC_NOTIFY                    = const(1 << 13)
_IRQ_GATTC_INDICATE                  = const(1 << 14)

def bt_irq(event, data):
    if event == _IRQ_CENTRAL_CONNECT:
        # A central has connected to this peripheral.
        conn_handle, addr_type, addr = data
    elif event == _IRQ_CENTRAL_DISCONNECT:
        # A central has disconnected from this peripheral.
        conn_handle, addr_type, addr = data
    elif event == _IRQ_GATTS_WRITE:
        # A central has written to this characteristic or descriptor.
        conn_handle, attr_handle = data
    elif event == _IRQ_GATTS_READ_REQUEST:
        # A central has issued a read. Note: this is a hard IRQ.
        # Return None to deny the read.
        # Note: This event is not supported on ESP32.
        conn_handle, attr_handle = data
    elif event == _IRQ_SCAN_RESULT:
        # A single scan result.
        addr_type, addr, connectable, rssi, adv_data = data
    elif event == _IRQ_SCAN_COMPLETE:
        # Scan duration finished or manually stopped.
        pass
    elif event == _IRQ_PERIPHERAL_CONNECT:
        # A successful gap_connect().
        conn_handle, addr_type, addr = data
    elif event == _IRQ_PERIPHERAL_DISCONNECT:
        # Connected peripheral has disconnected.
        conn_handle, addr_type, addr = data
    elif event == _IRQ_GATTC_SERVICE_RESULT:
        # Called for each service found by gattc_discover_services().
        conn_handle, start_handle, end_handle, uuid = data
    elif event == _IRQ_GATTC_CHARACTERISTIC_RESULT:
        # Called for each characteristic found by gattc_discover_services().
        conn_handle, def_handle, value_handle, properties, uuid = data
    elif event == _IRQ_GATTC_DESCRIPTOR_RESULT:
        # Called for each descriptor found by gattc_discover_descriptors().
        conn_handle, dsc_handle, uuid = data
    elif event == _IRQ_GATTC_READ_RESULT:
        # A gattc_read() has completed.
        conn_handle, value_handle, char_data = data
    elif event == _IRQ_GATTC_WRITE_STATUS:
        # A gattc_write() has completed.
        conn_handle, value_handle, status = data
    elif event == _IRQ_GATTC_NOTIFY:
        # A peripheral has sent a notify request.
        conn_handle, value_handle, notify_data = data
    elif event == _IRQ_GATTC_INDICATE:
        # A peripheral has sent an indicate request.
        conn_handle, value_handle, notify_data = data

bt = bluetooth.BLE()
bt.active(True)
bt.irq(handler=bt_irq)

bt.gap_connect(0, b'\xc4|\x8df\xdd\xf0', 2000)

time.sleep(5)

bt.gattc_discover_services(0)

bt.gattc_discover_characteristics(0, 49, 57)

time.sleep(10)
bt.gap_disconnect(0)
which seems to work pretty well (although everything is hardcodec,) but I get a esp32 reboot :shock: :

Code: Select all

/pyboard> repl
Entering REPL. Use Control-X to exit.
>
MicroPython v1.12 on 2019-12-20; ESP32 module (spiram) with ESP32
Type "help()" for more information.
>>> 
>>> import nexter
I (1251519) phy: phy_version: 4102, 2fa7a43, Jul 15 2019, 13:06:06, 0, 0
Guru Meditation Error: Core  1 panic'ed (LoadProhibited). Exception was unhandled.
Core 1 register dump:
PC      : 0x4015c4d0  PS      : 0x00060430  A0      : 0x8016403b  A1      : 0x3ffbb460  
A2      : 0x3ffc6fcc  A3      : 0x00000000  A4      : 0x3f429fbe  A5      : 0x3ffc2d38  
A6      : 0x00000003  A7      : 0x3ffc2d0c  A8      : 0x00000000  A9      : 0x3ffbb420  
A10     : 0x3ffc6fcc  A11     : 0x00000000  A12     : 0x00000004  A13     : 0x3ffbb460  
A14     : 0x00000001  A15     : 0x00000000  SAR     : 0x00000010  EXCCAUSE: 0x0000001c  
EXCVADDR: 0x00000004  LBEG    : 0x4009d410  LEND    : 0x4009d43e  LCOUNT  : 0x00000000  

ELF file SHA256: 0000000000000000000000000000000000000000000000000000000000000000

Backtrace: 0x4015c4cd:0x3ffbb460 0x40164038:0x3ffbb490 0x4015e64d:0x3ffbb4d0 0x40160f3d:0x3ffbb500 0x4015e295:0x3ffbb530 0x4015e2a7:0x3ffbb550 0x4015d136:0x3ffbb570 0x400f9317:0x3ffbb590 0x400999b5:0x3ffbb5b0

Rebooting...
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:4988
load:0x40078000,len:11408
load:0x40080400,len:6108
entry 0x400806bc
I (601) psram: This chip is ESP32-D0WD
E (601) spiram: SPI RAM enabled but initialization failed. Bailing out.
I (601) cpu_start: Failed to init external RAM; continuing without it.
I (609) cpu_start: Pro cpu up.
I (612) cpu_start: Application information:
I (617) cpu_start: Compile time:     Dec 20 2019 07:58:58
I (623) cpu_start: ELF file SHA256:  0000000000000000...
I (629) cpu_start: ESP-IDF:          v4.0-beta1
I (634) cpu_start: Starting app cpu, entry point is 0x400835e0
I (627) cpu_start: App cpu up.
I (645) heap_init: Initializing. RAM available for dynamic allocation:
I (652) heap_init: At 3FFAFF10 len 000000F0 (0 KiB): DRAM
I (658) heap_init: At 3FFB6388 len 00001C78 (7 KiB): DRAM
I (664) heap_init: At 3FFB9A20 len 00004108 (16 KiB): DRAM
I (670) heap_init: At 3FFBDB5C len 00000004 (0 KiB): DRAM
I (676) heap_init: At 3FFCCA50 len 000135B0 (77 KiB): DRAM
I (682) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (689) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (695) heap_init: At 4009E2E4 len 00001D1C (7 KiB): IRAM
I (701) cpu_start: Pro cpu start user code
I (720) spi_flash: detected chip: generic
I (720) spi_flash: flash io: dio
I (721) cpu_start: Chip Revision: 1
W (722) cpu_start: Chip revision is higher than the one configured in menuconfig. Suggest to upgrade it.
I (732) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
E (40) spiram: SPI RAM not initialized
MicroPython v1.12 on 2019-12-20; ESP32 module (spiram) with ESP32
Type "help()" for more information.
>>> 
Do you have an idea what I may be missing?

User avatar
jimmo
Posts: 2754
Joined: Tue Aug 08, 2017 1:57 am
Location: Sydney, Australia
Contact:

Re: Reading GATT Data from Xiaomi Flower Care

Post by jimmo » Mon Feb 17, 2020 12:00 am

Unrelated, but it looks like you're using a SPIRAM build on a non-SPIRAM board. You should just be using the regular generic build.

The crash is pretty surprising. Which firmware are you using (IDF 3.x or IDF 4.x ?).

When does the crash happen?

JohnN
Posts: 8
Joined: Sat Jan 25, 2020 11:05 am

Re: Reading GATT Data from Xiaomi Flower Care

Post by JohnN » Mon Feb 17, 2020 7:26 am

Hi Jimmo,

I was using IDF 4.X. To make sure it was no spi problem I flashed https://micropython.org/resources/firmw ... -v1.12.bin to the board today and ran the same code mentioned above again with "import nexter" (the code is stored in nexter.py) and I get this error message:

Code: Select all

/pyboard> repl
Entering REPL. Use Control-X to exit.
>
MicroPython v1.12 on 2019-12-20; ESP32 module with ESP32
Type "help()" for more information.
>>> 
>>> import nexter
I (78090) phy: phy_version: 4102, 2fa7a43, Jul 15 2019, 13:06:06, 0, 2
Guru Meditation Error: Core  1 panic'ed (LoadProhibited). Exception was unhandled.
Core 1 register dump:
PC      : 0x40151b34  PS      : 0x00060e30  A0      : 0x80158bdb  A1      : 0x3ffbb530  
A2      : 0x3ffc6e2c  A3      : 0x00000000  A4      : 0x3f4286fe  A5      : 0x3ffc2b9c  
A6      : 0x00000003  A7      : 0x3ffc2b68  A8      : 0x00000000  A9      : 0x3ffbb4f0  
A10     : 0x3ffc6e2c  A11     : 0x00000000  A12     : 0x00000004  A13     : 0x3ffbb530  
A14     : 0x00000001  A15     : 0x00000000  SAR     : 0x00000010  EXCCAUSE: 0x0000001c  
EXCVADDR: 0x00000004  LBEG    : 0x4000c2e0  LEND    : 0x4000c2f6  LCOUNT  : 0x00000000  

ELF file SHA256: 0000000000000000000000000000000000000000000000000000000000000000

Backtrace: 0x40151b31:0x3ffbb530 0x40158bd8:0x3ffbb560 0x40153af9:0x3ffbb5a0 0x40155f31:0x3ffbb5d0 0x40153781:0x3ffbb600 0x40153793:0x3ffbb620 0x401526a6:0x3ffbb640 0x400f78c7:0x3ffbb660 0x40097615:0x3ffbb680

Rebooting...
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:4988
load:0x40078000,len:10404
load:0x40080400,len:5680
entry 0x400806bc
I (519) cpu_start: Pro cpu up.
I (519) cpu_start: Application information:
I (519) cpu_start: Compile time:     Dec 20 2019 07:56:38
I (522) cpu_start: ELF file SHA256:  0000000000000000...
I (528) cpu_start: ESP-IDF:          v4.0-beta1
I (533) cpu_start: Starting app cpu, entry point is 0x40083014
I (526) cpu_start: App cpu up.
I (544) heap_init: Initializing. RAM available for dynamic allocation:
I (551) heap_init: At 3FFAFF10 len 000000F0 (0 KiB): DRAM
I (557) heap_init: At 3FFB6388 len 00001C78 (7 KiB): DRAM
I (563) heap_init: At 3FFB9A20 len 00004108 (16 KiB): DRAM
I (569) heap_init: At 3FFBDB5C len 00000004 (0 KiB): DRAM
I (575) heap_init: At 3FFCC8A0 len 00013760 (77 KiB): DRAM
I (581) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (588) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (594) heap_init: At 40099FB8 len 00006048 (24 KiB): IRAM
I (600) cpu_start: Pro cpu start user code
I (619) spi_flash: detected chip: generic
I (619) spi_flash: flash io: dio
I (619) cpu_start: Chip Revision: 1
W (621) cpu_start: Chip revision is higher than the one configured in menuconfig. Suggest to upgrade it.
I (632) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
MicroPython v1.12 on 2019-12-20; ESP32 module with ESP32
Type "help()" for more information.
>>> 


Post Reply