2024-03-23
Programm the ESP8266 using MicroPython. Using MicroPython you are able to run code directly on target machine without compile and upload.
Before install ensure that you have esptool.py
.
The easiest way to get it is to install app thonny
. You can install it with: snap install thonny
on ubuntu. thonny is an python IDE ideal for MicroPython.
Get MicroPython firmware: https://micropython.org/download/ESP8266_GENERIC/
# /snap/thonny/214/bin/python3.10 distribution incl. esptool.py
# erase flash
python3.10 -u -m esptool --port /dev/ttyUSB0 erase_flash
# install micropython
python3.10 -u -m esptool --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect 0 ESP8266_GENERIC-20240105-v1.22.1.bin
Here is an example code snippet to give a preview of MicroPython features.
# put this in boot.py to automatically connect to your WiFi network
def do_connect():
print('\nconnecting to network (WIFI / WLAN) ...')
import network
sta_if = network.WLAN(network.STA_IF)
if not sta_if.isconnected():
sta_if.active(True)
SSID = "<ssid>"
key = "<pass>"
sta_if.connect(SSID, key)
while not sta_if.isconnected():
pass
print(f"IP address, netmask, gateway, DNS: {sta_if.ifconfig()}")
# disable or enable access point
def access_point_enable(active):
print("\naccess point enable: {active}")
import network
ap_if = network.WLAN(network.AP_IF)
print("ap_if.active(): {ap_if.active()}")
print(f"IP address, netmask, gateway, DNS: {ap_if.ifconfig()}")
ap_if.active(active)
# make http request
def http_get(url):
print(f"\nmake http request: {url}")
import socket
_, _, host, path = url.split('/', 3)
addr = socket.getaddrinfo(host, 80)[0][-1]
s = socket.socket()
s.connect(addr)
s.send(bytes('GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n' % (path, host), 'utf8'))
print("\nRESPONSE\n")
while True:
data = s.recv(100)
if data:
print(str(data, 'utf8'), end='')
else:
break
s.close()
def free_space():
print("\nshow free space")
import uos
try:
# Attempt to use the statvfs function to get file system status.
# Note: This function might not be available on all devices.
fs_stat = uos.statvfs('/')
# Calculate the block size and the number of free blocks.
f_bsize = fs_stat[0]
f_bfree = fs_stat[3]
# Calculate free space in bytes.
free_space_bytes = f_bsize * f_bfree
print("Free space:", free_space_bytes, "bytes")
print("Free space:", free_space_bytes/1024/1024, "MB")
except AttributeError:
print("Function not supported on this device.")
# Define the size of the file to be 512KB
# example size = 512 * 1024 # 512KB
def create_file(size):
print(f"\ncreate random data random_data.bin with size: {size}")
import os
# Open a new file in write-binary ('wb') mode
with open('random_data.bin', 'wb') as file:
# Since generating and writing 512KB of data at once might be too much for some devices,
# we'll do it in smaller chunks. Here, we use 1024 bytes (1KB) chunks.
chunk_size = 1024
for _ in range(size // chunk_size):
# Generate a chunk of random bytes
chunk = os.urandom(chunk_size)
# Write the chunk to the file
file.write(chunk)
print('File with 512KB of random data created.')
def delete_file(name):
print(f"\ndelete file (folder) name: {name}")
import os
try:
os.remove(name)
print(f'File {name} deleted successfully.')
except OSError:
print(f'Error: File {name} not found or could not be deleted.')
def list_root_directory():
print(f"\nlist root directory")
import os
dirs = os.listdir(".")
for file in dirs:
print(file)
def system_info():
import machine
freq = machine.freq() # get the current frequency of the CPU
#machine.freq(160000000) # set the CPU frequency to 160 MHz
print(f"\nCPU frequency: {freq/1000000} Mhz")
import os
print(os.uname())
import sys
print(sys.modules.keys())
import gc
print(f"free memory: {gc.mem_free()} bytes")
print("# START PROGRAM")
# OS
#delete_file("foo")
#delete_file("random_data.bin")
#create_file(512*2*1024)
free_space()
list_root_directory()
# NETWORK
#do_connect()
#access_point_enable(True)
url = "http://checkip.amazonaws.com/"
http_get(url)
# machine
system_info()
print("# END PROGRAM")