NodeMCU Config: Difference between revisions
Content added Content deleted
(→Basics) |
|||
(29 intermediate revisions by the same user not shown) | |||
Line 5: | Line 5: | ||
= Micropython = |
= Micropython = |
||
*Documentation: |
|||
== Basics == |
|||
http://docs.micropython.org/en/latest/esp8266/quickref.html |
|||
== Installation == |
|||
*Flashing Micropython |
|||
Download firmware file from [http://micropython.org/download#esp8266 micropython.org] |
|||
*Installing: |
|||
sudo pip install esptool |
sudo pip install esptool |
||
esptool.py --port /dev/ttyUSB0 erase_flash |
esptool.py --port /dev/ttyUSB0 erase_flash |
||
esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect 0 ~/Desktop/esp8266-20171101-v1.9.3.bin |
esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect 0 ~/Desktop/esp8266-20171101-v1.9.3.bin |
||
* |
*Check the firmware integrity: |
||
import esp |
|||
<syntaxhighlight lang="python"> |
|||
esp.check_fw() |
|||
import esp |
|||
esp.check_fw() |
|||
</syntaxhighlight> |
|||
== Console Access == |
|||
* |
* Via Terminal: |
||
sudo apt install picocom |
sudo apt install picocom |
||
picocom /dev/ttyUSB0 -b115200 |
picocom /dev/ttyUSB0 -b115200 |
||
Exiting from picocom: |
|||
*Connecting via REPL(web): |
|||
Cntrl + A |
|||
import webrepl_setup |
|||
Cntrl + X |
|||
* Via REPL(web): |
|||
If you disabled automatic start-up on boot, you may run configured daemon on demand using: |
|||
import webrepl |
|||
<syntaxhighlight lang="python"> |
|||
webrepl.start() |
|||
import webrepl_setup |
|||
</syntaxhighlight> |
|||
* If you disabled automatic start-up on boot, you may run configured daemon on demand using: |
|||
<syntaxhighlight lang="python"> |
|||
import webrepl |
|||
webrepl.start() |
|||
</syntaxhighlight> |
|||
* Upload data using Serial Port |
|||
sudo pip install adafruit-ampy |
|||
ampy --port /dev/ttyUSB0 put ~/Desktop/main.py |
|||
ampy --port /dev/ttyUSB0 ls |
|||
== Error Codes == |
|||
Error Code Details: |
|||
https://github.com/micropython/micropython-lib/blob/master/errno/errno.py |
|||
== File System == |
|||
*Checking filesystem: |
*Checking filesystem: |
||
import os |
|||
<syntaxhighlight lang="python"> |
|||
os.listdir() |
|||
import os |
|||
os.listdir() |
|||
</syntaxhighlight> |
|||
*Create directories: |
*Create directories: |
||
<syntaxhighlight lang="python"> |
|||
os.mkdir('dir') |
|||
os.mkdir('dir') |
|||
</syntaxhighlight> |
|||
*Remove Files: |
*Remove Files: |
||
<syntaxhighlight lang="python"> |
|||
os.remove('data.txt') |
|||
os.remove('data.txt') |
|||
</syntaxhighlight> |
|||
*Reading data: |
|||
<syntaxhighlight lang="python"> |
|||
f = open('data.txt') |
|||
f.read() |
|||
f.close() |
|||
</syntaxhighlight> |
|||
*Writing Data to files: |
*Writing Data to files: |
||
<syntaxhighlight lang="python"> |
|||
f = open('data.txt', 'w') |
|||
f = open('data.txt', 'w') |
|||
f.write('some data') |
|||
f.close() |
|||
f.close() |
|||
</syntaxhighlight> |
|||
*Execute a script called foo.py |
|||
*Reading data: |
|||
import foo |
|||
f = open('data.txt') |
|||
f.read() |
|||
f.close() |
|||
== Information == |
|||
* Checking Machine Frequency & Overclocking: |
|||
import machine |
|||
*Checking Machine Frequency & Overclocking: |
|||
machine.freq() # get the current frequency of the CPU |
|||
<syntaxhighlight lang="python"> |
|||
machine.freq(160000000) # set the CPU frequency to 160 MHz |
|||
import machine |
|||
machine.freq() # get the current frequency of the CPU |
|||
machine.freq(160000000) # set the CPU frequency to 160 MHz |
|||
</syntaxhighlight> |
|||
*Diagnostics |
|||
import port_diag |
|||
== Networking == |
|||
=== AP Mode === |
|||
*Check AP Name: |
*Check AP Name: |
||
<syntaxhighlight lang="python"> |
|||
import network |
|||
import network |
|||
ap = network.WLAN(network.AP_IF) |
|||
print(ap.config('essid')) |
|||
print(ap.config('essid')) |
|||
</syntaxhighlight> |
|||
*Change AP name and password: |
*Change AP name and password: |
||
<syntaxhighlight lang="python"> |
|||
import network |
|||
import network |
|||
ap = network.WLAN(network.AP_IF) |
|||
ap.active(True) |
|||
ap.active(True) |
|||
ap.config(essid='MyESP8266', authmode=network.AUTH_WPA_WPA2_PSK, password='mypassword') |
|||
ap.config(essid='MyESP8266', authmode=network.AUTH_WPA_WPA2_PSK, password='mypassword') # Password should be min 8 char |
|||
print(ap.config('essid')) |
|||
print(ap.config('essid')) |
|||
</syntaxhighlight> |
|||
*Turning off AP: |
|||
*Boot Process: |
|||
<syntaxhighlight lang="python"> |
|||
As a final step of boot procedure, ''main.py'' is executed from filesystem |
|||
ap = network.WLAN(network.AP_IF) |
|||
This file is a hook to start up a user application each time on boot (instead of going to REPL). |
|||
ap.active(False) |
|||
For small test applications, you may name them directly as ''main.py'' |
|||
</syntaxhighlight> |
|||
but instead it’s recommended to keep your application(s) in separate files, and have just the following in main.py: |
|||
=== Station Mode === |
|||
import my_app |
|||
my_app.main() |
|||
Connecting to WIFI AP: |
|||
* Upload data using Serial Port |
|||
sta_if = network.WLAN(network.STA_IF) |
|||
sudo pip install adafruit-ampy |
|||
sta_if.active(True) |
|||
ampy --port /dev/ttyUSB0 put ~/Desktop/main.py |
|||
sta_if.connect('<your ESSID>', '<your password>') |
|||
To check if the connection is established: |
|||
== Deep-sleep mode == |
|||
sta_if.isconnected() |
|||
Once established you can check the IP address: |
|||
*This shut down the ESP8266 and all its peripherals & also WiFi. |
|||
sta_if.ifconfig() |
|||
*But not including the real-time-clock, which is used to wake the chip. |
|||
*This drastically reduces current consumption and is a good way to make devices that can run for a while on a battery. |
|||
*You Must connect GPIO16 to the reset pin. |
|||
You can then disable the access-point interface if you no longer need it: |
|||
<syntaxhighlight lang="python"> |
|||
ap_if.active(False) |
|||
import machine |
|||
Disconnecting from Station: |
|||
# configure RTC.ALARM0 to be able to wake the device |
|||
sta_if = network.WLAN(network.STA_IF) |
|||
rtc = machine.RTC() |
|||
sta_if.active(False) |
|||
rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP) |
|||
Here is a function you can run (or put in your boot.py file) to automatically connect to your WiFi network: |
|||
# check if the device woke from a deep sleep |
|||
if machine.reset_cause() == machine.DEEPSLEEP_RESET: |
|||
print('woke from a deep sleep') |
|||
<syntaxhighlight lang="python"> |
|||
# set RTC.ALARM0 to fire after 10 seconds (waking the device) |
|||
def do_connect(): |
|||
rtc.alarm(rtc.ALARM0, 10000) |
|||
import network |
|||
sta_if = network.WLAN(network.STA_IF) |
|||
# put the device to sleep |
|||
if not sta_if.isconnected(): |
|||
machine.deepsleep() |
|||
print('connecting to network...') |
|||
sta_if.active(True) |
|||
sta_if.connect('<essid>', '<password>') |
|||
while not sta_if.isconnected(): |
|||
pass |
|||
print('network config:', sta_if.ifconfig()) |
|||
</syntaxhighlight> |
</syntaxhighlight> |
||
== |
== Boot Process == |
||
#As a final step of boot procedure, ''main.py'' is executed from filesystem |
|||
#This file is a hook to start up a user application each time on boot (instead of going to REPL). |
|||
#For small test applications, you may name them directly as ''main.py'' |
|||
#But instead it’s recommended to keep your application(s) in separate files, and have just the following in main.py: |
|||
<syntaxhighlight lang="python"> |
|||
import my_app |
|||
my_app.main() |
|||
</syntaxhighlight> |
|||
== boot.py File == |
|||
===Playing with GPIO=== |
|||
<syntaxhighlight lang="python"> |
<syntaxhighlight lang="python"> |
||
# This file is executed on every boot (including wake-boot from deepsleep) |
|||
import esp |
|||
import uos |
|||
import machine |
import machine |
||
import gc |
|||
import webrepl |
|||
import network |
|||
import ntptime |
|||
#from machine import RTC |
|||
import micropython |
|||
import time |
import time |
||
import urandom |
|||
pin = machine.Pin(2, machine.Pin.OUT) |
|||
#esp.osdebug(None) |
|||
def toggle(p): |
|||
#uos.dupterm(None, 1) # disable REPL on UART(0) |
|||
p.value(not p.value()) |
|||
webrepl.start() |
|||
while True: |
|||
gc.collect() |
|||
time.sleep_ms(urandom.getrandbits(8)) |
|||
toggle(pin) |
|||
</syntaxhighlight> |
|||
# Determine if waking from Deep Sleep |
|||
===Fading an LED=== |
|||
if machine.reset_cause() == machine.DEEPSLEEP_RESET: |
|||
<syntaxhighlight lang="python"> |
|||
print('Woke from a deep sleep') |
|||
import time, math |
|||
import machine |
|||
# Machine Stats |
|||
led = machine.PWM(machine.Pin(2), freq=1000) |
|||
print("Freq: ", machine.freq()/1000000, "MHz") |
|||
#print("ESP Flash size: ", esp.flash_size()) |
|||
#print("ESP Free Mem: ", esp.freemem()) |
|||
print("Free Mem: ", gc.mem_free()/1000,"KB") |
|||
#print("Micropython Info: ") |
|||
#micropython.mem_info() |
|||
def pulse(l, t): |
|||
for i in range(20): |
|||
l.duty(int(math.sin(i / 10 * math.pi) * 500 + 500)) |
|||
time.sleep_ms(t) |
|||
# Flash Space stats |
|||
while True: |
|||
space = uos.statvfs('/') |
|||
pulse(led, 20) |
|||
total_space = (space[1] * space[3])/1000000 |
|||
</syntaxhighlight> |
|||
used_space = (space[2] * space[4])/1000000 |
|||
free_space = total_space - used_space |
|||
print("Total:", total_space, "MB Used:", used_space,"MB Free:", free_space,"MB") |
|||
# WiFi Config |
|||
=== Control a hobby servo === |
|||
sta_if = network.WLAN(network.STA_IF) |
|||
sta_if.active(True) # allow auto reconnect |
|||
if not sta_if.isconnected(): |
|||
Hobby servo motors can be controlled using PWM. |
|||
print('Connecting to WiFi...') |
|||
They require a frequency of 50Hz and a duty between about 40 and 115, with 77 being the center value. |
|||
sta_if.active(True) |
|||
sta_if.connect('TP-Link_6A31', 'Kirat#291011') |
|||
while not sta_if.isconnected(): |
|||
pass |
|||
print('STA Config: ', sta_if.config('essid'), sta_if.ifconfig()) |
|||
*Manual Movements |
|||
<syntaxhighlight lang="python"> |
|||
servo = machine.PWM(machine.Pin(12), freq=50) |
|||
servo.duty(40) |
|||
servo.duty(115) |
|||
servo.duty(77) |
|||
</syntaxhighlight> |
|||
# Wifi Access Point config |
|||
*Random movements: |
|||
ap = network.WLAN(network.AP_IF) |
|||
<syntaxhighlight lang="python"> |
|||
ap.config(essid='MicroPythonAP', authmode=network.AUTH_WPA_WPA2_PSK, password='Admin@123') # Password should be min 8 char |
|||
servo = machine.PWM(machine.Pin(12), freq=50) |
|||
#ap.active(False) |
|||
while True: |
|||
print('AP Config: ', ap.config('essid'), ap.ifconfig()) |
|||
servo.duty(urandom.getrandbits(8)) |
|||
time.sleep(1) |
|||
</syntaxhighlight> |
|||
=== One Wire DS18B20 Temp Sensor === |
|||
<syntaxhighlight lang="python"> |
|||
import time |
|||
import machine |
|||
import onewire, ds18x20 |
|||
# synchronize with ntp need to be connected to wifi |
|||
# the device is on GPIO12 |
|||
rtc = machine.RTC() |
|||
try: |
|||
ntptime.settime() # set the rtc datetime from the remote server |
|||
print("Time: ", rtc.datetime()) # get the date and time in UTC |
|||
except OSError: |
|||
print("Time: Unable to get data from Server") |
|||
# create the onewire object |
|||
ds = ds18x20.DS18X20(onewire.OneWire(dat)) |
|||
# Deep Sleep config |
|||
# scan for devices on the bus |
|||
def deep_sleep(delta): |
|||
roms = ds.scan() |
|||
delay = delta*1000*60 |
|||
print('found devices:', roms) |
|||
rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP) |
|||
rtc.alarm(rtc.ALARM0, delay) |
|||
print("Deep Sleep for: ", delta," min") |
|||
machine.deepsleep() |
|||
# loop 10 times and print all temperatures |
|||
# Flash Onboard LED |
|||
for i in range(10): |
|||
def flash_led(n,x,y): |
|||
print('temperatures:', end=' ') |
|||
pin = machine.Pin(2, machine.Pin.OUT) |
|||
ds.convert_temp() |
|||
pin.on() |
|||
for |
for i in range(n): |
||
pin.off() |
|||
time.sleep(x) |
|||
pin.on() |
|||
time.sleep(y) |
|||
</syntaxhighlight> |
</syntaxhighlight> |
||
<br /> |
<br /> |
Latest revision as of 15:30, 5 June 2020
Micropython
- Documentation:
http://docs.micropython.org/en/latest/esp8266/quickref.html
Installation
- Flashing Micropython
Download firmware file from micropython.org
sudo pip install esptool esptool.py --port /dev/ttyUSB0 erase_flash esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect 0 ~/Desktop/esp8266-20171101-v1.9.3.bin
- Check the firmware integrity:
import esp
esp.check_fw()
Console Access
- Via Terminal:
sudo apt install picocom picocom /dev/ttyUSB0 -b115200
Exiting from picocom:
Cntrl + A Cntrl + X
- Via REPL(web):
import webrepl_setup
- If you disabled automatic start-up on boot, you may run configured daemon on demand using:
import webrepl
webrepl.start()
- Upload data using Serial Port
sudo pip install adafruit-ampy ampy --port /dev/ttyUSB0 put ~/Desktop/main.py ampy --port /dev/ttyUSB0 ls
Error Codes
Error Code Details:
https://github.com/micropython/micropython-lib/blob/master/errno/errno.py
File System
- Checking filesystem:
import os
os.listdir()
- Create directories:
os.mkdir('dir')
- Remove Files:
os.remove('data.txt')
- Reading data:
f = open('data.txt')
f.read()
f.close()
- Writing Data to files:
f = open('data.txt', 'w')
f.write('some data')
f.close()
- Execute a script called foo.py
import foo
Information
- Checking Machine Frequency & Overclocking:
import machine
machine.freq() # get the current frequency of the CPU
machine.freq(160000000) # set the CPU frequency to 160 MHz
- Diagnostics
import port_diag
Networking
AP Mode
- Check AP Name:
import network
ap = network.WLAN(network.AP_IF)
print(ap.config('essid'))
- Change AP name and password:
import network
ap = network.WLAN(network.AP_IF)
ap.active(True)
ap.config(essid='MyESP8266', authmode=network.AUTH_WPA_WPA2_PSK, password='mypassword') # Password should be min 8 char
print(ap.config('essid'))
- Turning off AP:
ap = network.WLAN(network.AP_IF)
ap.active(False)
Station Mode
Connecting to WIFI AP:
sta_if = network.WLAN(network.STA_IF) sta_if.active(True) sta_if.connect('<your ESSID>', '<your password>')
To check if the connection is established:
sta_if.isconnected()
Once established you can check the IP address:
sta_if.ifconfig()
You can then disable the access-point interface if you no longer need it:
ap_if.active(False)
Disconnecting from Station:
sta_if = network.WLAN(network.STA_IF) sta_if.active(False)
Here is a function you can run (or put in your boot.py file) to automatically connect to your WiFi network:
def do_connect():
import network
sta_if = network.WLAN(network.STA_IF)
if not sta_if.isconnected():
print('connecting to network...')
sta_if.active(True)
sta_if.connect('<essid>', '<password>')
while not sta_if.isconnected():
pass
print('network config:', sta_if.ifconfig())
Boot Process
- As a final step of boot procedure, main.py is executed from filesystem
- This file is a hook to start up a user application each time on boot (instead of going to REPL).
- For small test applications, you may name them directly as main.py
- But instead it’s recommended to keep your application(s) in separate files, and have just the following in main.py:
import my_app
my_app.main()
boot.py File
# This file is executed on every boot (including wake-boot from deepsleep)
import esp
import uos
import machine
import gc
import webrepl
import network
import ntptime
#from machine import RTC
import micropython
import time
#esp.osdebug(None)
#uos.dupterm(None, 1) # disable REPL on UART(0)
webrepl.start()
gc.collect()
# Determine if waking from Deep Sleep
if machine.reset_cause() == machine.DEEPSLEEP_RESET:
print('Woke from a deep sleep')
# Machine Stats
print("Freq: ", machine.freq()/1000000, "MHz")
#print("ESP Flash size: ", esp.flash_size())
#print("ESP Free Mem: ", esp.freemem())
print("Free Mem: ", gc.mem_free()/1000,"KB")
#print("Micropython Info: ")
#micropython.mem_info()
# Flash Space stats
space = uos.statvfs('/')
total_space = (space[1] * space[3])/1000000
used_space = (space[2] * space[4])/1000000
free_space = total_space - used_space
print("Total:", total_space, "MB Used:", used_space,"MB Free:", free_space,"MB")
# WiFi Config
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True) # allow auto reconnect
if not sta_if.isconnected():
print('Connecting to WiFi...')
sta_if.active(True)
sta_if.connect('TP-Link_6A31', 'Kirat#291011')
while not sta_if.isconnected():
pass
print('STA Config: ', sta_if.config('essid'), sta_if.ifconfig())
# Wifi Access Point config
ap = network.WLAN(network.AP_IF)
ap.config(essid='MicroPythonAP', authmode=network.AUTH_WPA_WPA2_PSK, password='Admin@123') # Password should be min 8 char
#ap.active(False)
print('AP Config: ', ap.config('essid'), ap.ifconfig())
# synchronize with ntp need to be connected to wifi
rtc = machine.RTC()
try:
ntptime.settime() # set the rtc datetime from the remote server
print("Time: ", rtc.datetime()) # get the date and time in UTC
except OSError:
print("Time: Unable to get data from Server")
# Deep Sleep config
def deep_sleep(delta):
delay = delta*1000*60
rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)
rtc.alarm(rtc.ALARM0, delay)
print("Deep Sleep for: ", delta," min")
machine.deepsleep()
# Flash Onboard LED
def flash_led(n,x,y):
pin = machine.Pin(2, machine.Pin.OUT)
pin.on()
for i in range(n):
pin.off()
time.sleep(x)
pin.on()
time.sleep(y)
- References
{{#widget:DISQUS
|id=networkm
|uniqid=NodeMCU Config
|url=https://aman.awiki.org/wiki/NodeMCU_Config
}}