Ивайло Радев
интернет кибик
🇧🇬 📷 🔌 🔧 🔨 🍺
MicroPython на ESP8266
Инсталиране
1. Изтеглете и запишете Python
2. Отворите Terminal и инсталирайте esptool
Команда:
pip install esptool
3. Включете вашия ESP8266 в USB порт;
4. Направете копие на стария firmware;
Команда:
esptool.py --port {USB_PORT} --baud 115200 read_flash 0x00000 0x400000 image4M.bin
5. Отидете на MicroPython firmware downloads и изтеглете последния firmware за вашия ESP8266 модул.
6. Форматиране и изтриване на стария firmware:
Команда:
esptool.py --port {USB_PORT} erase_flash
Примерен отговор:
esptool.py v3.2
Serial port {USB_PORT}
Connecting....
Detecting chip type... Unsupported detection protocol, switching and trying again...
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 84:f3:eb:b2:10:cd
Uploading stub...
Running stub...
Stub running...
Erasing flash (this may take a while)...
Chip erase completed successfully in 7.1s
Hard resetting via RTS pin...
7. Инсталиране на нов firmware:
Команда:
esptool.py --port {USB_PORT} --baud 460800 write_flash --flash_size=detect 0 /path_to_file/esp8266-{FILE_VERSION}.bin
Примерен отговор:
esptool.py v3.2
Serial port {USB_PORT}
Connecting....
Detecting chip type... Unsupported detection protocol, switching and trying again...
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 84:f3:eb:b2:10:cd
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Flash will be erased from 0x00000000 to 0x0009afff...
Flash params set to 0x0040
Compressed 633688 bytes to 416262...
Writing at 0x00000000... (3 %)
Writing at 0x000057fc... (7 %)
Writing at 0x0000c338... (11 %)
....
Writing at 0x00098493... (100 %)
Wrote 633688 bytes (416262 compressed) at 0x00000000 in 9.4 seconds (effective 540.0 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...
8. Проверете връзката към ESP8266. Инсталирайте PuTTY or Thonny
9. Направете серийна връзка с {USB_PORT}, към който е свързан модулът.
Примерен отговор:
MicroPython v1.17 on 2021-09-02; ESP module with ESP8266
Type "help()" for more information.
>>>
Стартиране
Има два файла, които се третират специално от ESP8266, когато се стартира: boot.py и main.py. Скриптът boot.py се първо изпълнява (ако съществува) и след това, след като завърши - се изпълнява скриптът main.py. Можете сами да създадете тези файлове и да ги попълните с кода, който искате да стартирате, когато устройството се стартира.
Команди
Файлове система
Проверка на качените файлове:
>>> import os
>>> os.listdir()
Изтриване на файл:
os.remove('test.py')
Нов файл:
>>> f = open('data.txt', 'w')
>>> f.write('some data')
>>> f.close()
Редакция на файл:
>>> f = open('data.txt', 'a')
>>> f.write('some new data\n')
>>> f.close()
Четене на файл:
>>> f = open('data.txt')
>>> f.read()
'some data'
>>> f.close()
Създаване на директория:
>>> os.mkdir('dir')
Мрежи
Основна WiFi конфигурация:
import network
sta_if = network.WLAN(network.STA_IF);
sta_if.active(True)
sta_if.scan() # Scan for available access points
sta_if.connect("<AP_name>", "<password>") # Connect to an AP
sta_if.isconnected() # Check for successful connection
sta_if.ifconfig() # See IP Address
# Change name/password of ESP8266's AP:
ap_if = network.WLAN(network.AP_IF)
ap_if.config(essid="<AP_NAME>", authmode=network.AUTH_WPA_WPA2_PSK, password="<password>")
# Change Device name
sta_if.config(dhcp_hostname="NEW DEVICE NAME")
print(sta_if.config('dhcp_hostname'))
Pins and GPIO
Наличните пинове са: 0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16, които съответстват на действителните номера на GPIO пинове на чипа ESP8266.
from machine import Pin
p0 = Pin(0, Pin.OUT) # create output pin on GPIO0
p0.high() # set pin to high
p0.low() # set pin to low
p0.value(1) # set pin to high
p2 = Pin(2, Pin.IN) # create input pin on GPIO2
print(p2.value()) # get value, 0 or 1
p4 = Pin(4, Pin.IN, Pin.PULL_UP) # enable internal pull-up resistor
p5 = Pin(5, Pin.OUT, value=1) # set pin high on creation
Delay and timing
import time
time.sleep(1) # sleep for 1 second
time.sleep_ms(500) # sleep for 500 milliseconds
time.sleep_us(10) # sleep for 10 microseconds
start = time.ticks_ms() # get millisecond counter
delta = time.ticks_diff(start, time.ticks_ms()) # compute time difference
Analog read
ADC се предлага на специален pin. Обърнете внимание, че входните напрежения на pin на ADC трябва да са между 0v и 1v.
from machine import ADC
adc = ADC(0) # create ADC object on ADC pin
adc.read() # read value, 0-1024
Digital read
from machine import Pin
from time import sleep_ms
button = Pin(4, Pin.IN)
while(True):
print(button.value())
sleep_ms(100)
Deep-sleep
Свържете GPIO16 (D0) към pin за нулиране (RST). Тогава следният код може да се използва за заспиване, събуждане и проверка на причината за рестартиране:
import machine
# configure RTC.ALARM0 to be able to wake the device
rtc = machine.RTC()
rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)
# check if the device woke from a deep sleep
if machine.reset_cause() == machine.DEEPSLEEP_RESET:
print('woke from a deep sleep')
# set RTC.ALARM0 to fire after 10 seconds (waking the device)
rtc.alarm(rtc.ALARM0, 10000)
# put the device to sleep
machine.deepsleep()
WebREPL
WebREPL (REPL през WebSockets, достъпен чрез уеб браузър) е експериментална функция, налична в ESP8266. Изтеглете уеб клиент от GitHub
import webrepl
webrepl.start()
При първо свързване ще трябва да зададете парола, която ще използвате за бъдещи сесии.
Управление на паметта
Garbage collector - обикновено има две отговорности:
- Разпределяне на нови обекти в наличната памет.
- Освобождаване на памет.
Функционалността на Garbage collector-а в MicroPython е достъпна чрез вградения gc модул:
>>> x = 5
>>> x
5
>>> import gc
>>> gc.enable()
>>> gc.mem_alloc()
1312
>>> gc.mem_free()
2071392
>>> gc.collect()
19
>>> gc.disable()
>>>
gc.enable() - Включва garbage collection.
gc.disable() - Изключва automatic garbage collection. Можете да изчистите паметта, но ръчно с команда gc.collect().
gc.collect() - Пускане на garbage collection.
gc.mem_alloc() - Показва използвана памет в байтове;
gc.mem_free() - Показва свободната памет в байтове, или -1, ако данните не са известни.
Езикови примери
Conditional Statements
Условните изрази позволяват контрол върху това кои елементи от кода се изпълняват в зависимост от конкретни случаи.
temperature = 15
target = 10
if temperature > target:
print("Too High!")
elif temperature < target:
print("Too Low!")
else:
print("Just right!")
Loops
Циклите са друга важна характеристика на всеки език за програмиране. Това ви позволява да променяте кода си и да повтаряте функции/задачи/и т.н.
x = 0
for y in range(0, 9):
x += 1
print(x)
x = 0
while x < 9:
x += 1
print(x)
Functions
Функциите са код, които се извикват по име. Данните могат да бъдат предадени в него, за да се работи с тях (т.е. параметрите) и по желание могат да върнат данни.
def add(number1, number2):
return number1 + number2
add(1, 2) # expect a result of 3
def welcome(name):
welcome_phrase = "Hello, " + name + "!"
print(welcome_phrase)
welcome("User") # expect "Hello, User!"
Lists
Структура от данни, която съдържа подредена колекция (последователност) от елементи.
networks = ['lora', 'sigfox', 'wifi', 'bluetooth', 'lte-m']
print(networks[2]) # expect 'wifi'