# M5Stack_MicroPython
**Repository Path**: devidlee2020/M5Stack_MicroPython
## Basic Information
- **Project Name**: M5Stack_MicroPython
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-05-01
- **Last Updated**: 2024-06-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# M5Stack Micropython Base [Lobo MicroPython](https://github.com/loboris/MicroPython_ESP32_psRAM_LoBo/)
## Getting Started
- See LoBo MicroPython [WiKi](https://github.com/loboris/MicroPython_ESP32_psRAM_LoBo/wiki)
- Please make sure run ```./BUILD.sh menuconfig``` choose open **MicroPython --> Modules --> Use Display module**
### Simple Build instructions
This works for Linux or macOS, windows is slightly different. Follow the information above to prepare your build environment.
1. Clone the repository `git clone https://github.com/m5stack/M5Stack_MicroPython`
2. Enter the build `cd M5Stack_MicroPython/MicroPython_BUILD/`
3. Build the firmware `./BUILD.sh`
4. Flash the firmware `./BUILD.sh flash`
## Upload code
- Use [Ampy](https://github.com/adafruit/ampy)
- Use [Lobo Miropython filesystems](https://github.com/loboris/MicroPython_ESP32_psRAM_LoBo/wiki/filesystems)
## Contents
- [MicroPython API](#micropython-api)
- [LCD](#lcd)
- [Button](#button)
- [SD Card](#sd-card)
- [Speaker](#speaker)
- [GPIO](#gpio)
- [PWM](#pwm)
- [ADC](#adc)
- [DAC](#dac)
- [I2C](#i2c)
- [SPI](#spi)
- [UART](#uart)
- [Timer](#timer)
- [Neopixel](#neopixel)
- [RTC](#rtc)
- [LoBo MicroPython WiKi](https://github.com/loboris/MicroPython_ESP32_psRAM_LoBo/wiki)
# MicroPython API
Micropython Getting Started
In m5stack.py already init timer 0 as EXTBASE, lcd pwm use timer 1, speak use timer 2, 8
```python
import m5stack
```
## **LCD**
---
Import M5Stack:
```python
from m5stack import lcd
lcd.print('hello world!')
```
#### Colors
**Color** value are given as 24 bit integer numbers, 8-bit per color.
For example: **0xFF0000** represents the RED color. Only upper 6 bits of the color component value is used.
The following color constants are defined and can be used as color arguments:
**BLACK, NAVY, DARKGREEN, DARKCYAN, MAROON, PURPLE, OLIVE, LIGHTGREY, DARKGREY, BLUE, GREEN, CYAN, RED, MAGENTA, YELLOW, WHITE, ORANGE, GREENYELLOW, PINK**
#### Drawing
All **drawings** coordinates are **relative** to the **display window**.
Initialy, the display window is set to full screen, and there are methods to set the window to the part of the full screen.
#### Fonts
9 bit-mapped fornts and one vector 7-segment font are included.
Unlimited number of fonts from file can also be used.
The following font constants are defined and can be used as font arguments:
**FONT_Default, FONT_DefaultSmall, FONT_DejaVu18, FONT_Dejavu24, FONT_Ubuntu, FONT_Comic, FONT_Minya, FONT_Tooney, FONT_Small, FONT_7seg**
---
## Methods
### lcd.pixel(x, y [,color])
Draw the pixel at position (x,y).
If *color* is not given, current foreground color is used.
### lcd.readPixel(x, y)
Get the pixel color value at position (x,y).
### lcd.line(x, y, x1, y1 [,color])
Draw the line from point (x,y) to point (x1,y1)
If *color* is not given, current foreground color is used.
### lcd.lineByAngle(x, y, start, length, angle [,color])
Draw the line from point (x,y) with length *lenght* starting st distance *start* from center.
If *color* is not given, current foreground color is used.
The angle is given in degrees (0~359).
### lcd.triangle(x, y, x1, y1, x2, y2 [,color, fillcolor])
Draw the triangel between points (x,y), (x1,y1) and (x2,y2).
If *color* is not given, current foreground color is used.
If *fillcolor* is given, filled triangle will be drawn.
### lcd.circle(x, y, r [,color, fillcolor])
Draw the circle with center at (x,y) and radius r.
If *color* is not given, current foreground color is used.
If *fillcolor* is given, filled circle will be drawn.
### lcd.ellipse(x, y, rx, ry [opt, color, fillcolor])
Draw the circle with center at (x,y) and radius r.
If *color* is not given, current foreground color is used.
**opt* argument defines the ellipse segment to be drawn, default id 15, all ellipse segments.
Multiple segments can drawn, combine (logical or) the values.
* 1 - upper left segment
* 2 - upper right segment
* 4 - lower left segment
* 8 - lower right segment
If *fillcolor* is given, filled elipse will be drawn.
### lcd.arc(x, y, r, thick, start, end [color, fillcolor])
Draw the arc with center at (x,y) and radius *r*, starting at angle *start* and ending at angle *end*
The thicknes of the arc outline is set by the *thick* argument
If *fillcolor* is given, filled arc will be drawn.
### lcd.poly(x, y, r, sides, thick, [color, fillcolor, rotate])
Draw the polygon with center at (x,y) and radius *r*, with number of sides *sides*
The thicknes of the polygon outline is set by the *thick* argument
If *fillcolor* is given, filled polygon will be drawn.
If *rotate* is given, the polygon is rotated by the given angle (0~359)
### lcd.rect(x, y, width, height, [color, fillcolor])
Draw the rectangle from the upper left point at (x,y) and width *width* and height *height*
If *fillcolor* is given, filled rectangle will be drawn.
### lcd.roundrect(x, y, width, height, r [color, fillcolor])
Draw the rectangle with rounded corners from the upper left point at **(x,y)** and width **width** and height **height**
Corner radius is given by **r** argument.
If **fillcolor** is given, filled rectangle will be drawn.
### lcd.clear([color])
Clear the screen with default background color or specific color if given.
### lcd.clearWin([color])
Clear the current display window with default background color or specific color if given.
### lcd.orient(orient)
Set the display orientation.
Use one of predifined constants:
**lcd.PORTRAIT**, **lcd.LANDSCAPE**, **lcd.PORTRAIT_FLIP**, **lcd.LANDSCAPE_FLIP**
### lcd.font(font [,rotate, transparent, fixedwidth, dist, width, outline, color])
Set the active font and its characteristics.
| Argument | Description |
| - | - |
| font | required, use font name constant or font file name |
| rotate | optional, set font rotation angle (0~360) |
| transparent | only draw font's foreground pixels |
| fixedwidth | draw proportional font with fixed character width, max character width from the font is used |
| dist | only for 7-seg font, the distance between bars |
| width | only for 7-seg font, the width of the bar |
| outline | only for 7-seg font, draw the outline |
| color | font color, if not given the current foreground color is used |
### lcd.attrib7seg(dist, width, outline, color)
Set characteristics of the 7-segment font
| Argument | Description |
| - | - |
| dist | the distance between bars |
| width | the width of the bar |
| outline | outline color |
| color | fill color |
### lcd.fontSize()
Return width and height of the active font
### lcd.print(text[,x, y, color, rotate, transparent, fixedwidth, wrap])
Display the string *text* at possition (x,y).
If *color* is not given, current foreground color is used.
* **x**: horizontal position of the upper left point in pixels, special values can be given:
* CENTER, centers the text
* RIGHT, right justifies the text
* LASTX, continues from last X position; offset can be used: LASTX+n
* **y**: vertical position of the upper left point in pixels, special values can be given:
* CENTER, centers the text
* BOTTOM, bottom justifies the text
* LASTY, continues from last Y position; offset can be used: LASTY+n
* **text**: string to be displayed. Two special characters are allowed in strings:
* ‘\r’ CR (0x0D), clears the display to EOL
* ‘\n’ LF (ox0A), continues to the new line, x=0
### lcd.text(x, y, text [, color])
Display the string *text* at possition (x,y).
If *color* is not given, current foreground color is used.
* **x**: horizontal position of the upper left point in pixels, special values can be given:
* CENTER, centers the text
* RIGHT, right justifies the text
* LASTX, continues from last X position; offset can be used: LASTX+n
* **y**: vertical position of the upper left point in pixels, special values can be given:
* CENTER, centers the text
* BOTTOM, bottom justifies the text
* LASTY, continues from last Y position; offset can be used: LASTY+n
* **text**: string to be displayed. Two special characters are allowed in strings:
* ‘\r’ CR (0x0D), clears the display to EOL
* ‘\n’ LF (ox0A), continues to the new line, x=0
### lcd.textWidth(text)
Return the width of the string *text* using the active font fontSize
### lcd.textClear(x, y, text [, color])
Clear the the screen area used by string *text* at possition (x,y) using the bacckground color *color*.
If *color* is not given, current background color is used.
### lcd.image(x, y, file [,scale, type])
Display the image from the file *file* on position (x,y)
* **JPG** and **BMP** can be displayed.
* Constants **lcd.CENTER**, **lcd.BOTTOM**, **lcd.RIGHT** can be used for x&y
* **x** and **y** values can be negative
**scale** (jpg): image scale factor: 0 to 3; if scale>0, image is scaled by factor 1/(2^scale) (1/2, 1/4 or 1/8)
**scale** (bmp): image scale factor: 0 to 7; if scale>0, image is scaled by factor 1/(scale+1)
**type**: optional, set the image type, constants *lcd.JPG* or *lcd.BMP* can be used. If not set, file extension and/or file content will be used to determine the image type.
### lcd.setwin(x, y, x1, y1)
Set active display window to screen rectangle (x,y) - (x1,y1)
### lcd.resetwin()
Reset active display window to full screen size.
### lcd.savewin()
Save active display window dimensions.
### lcd.restorewin()
Restore active display window dimensions previously saved wint savewin().
### lcd.screensize()
Return the display size, (width, height)
### lcd.winsize()
Return the active display window size, (width, height)
### lcd.hsb2rgb(hue, saturation, brightness)
Converts the components of a color, as specified by the HSB model, to an equivalent set of values for the default RGB model.
Returns 24-bit integer value suitable to be used as color argiment
Arguments
* **hue**: float: any number, the floor of this number is subtracted from it to create a fraction between 0 and 1. This fractional number is then multiplied by 360 to produce the hue angle in the HSB color model.
* **saturation**: float; 0 ~ 1.0
* **brightness**: float; 0 ~ 1.0
### lcd.compileFont(file_name [,debug])
Compile the source font file (must have **.c** extension) to the binary font file (same name, **.fon** extension) which can be used as external font.
If *debug=True* the information about compiled font will be printed.
You can create the **c** source file from any **tft** font using the included [ttf2c_vc2003.exe](https://github.com/loboris/MicroPython_ESP32_psRAM_LoBo/tree/master/MicroPython_BUILD/components/micropython/esp32/modules_examples/tft/font_tool/) program.
See [README](https://github.com/loboris/MicroPython_ESP32_psRAM_LoBo/tree/master/MicroPython_BUILD/components/micropython/esp32/modules_examples/tft/font_tool/README.md) for instructions.
You can create **c** source file or **.fon** file from **tft** font using [online converter](https://loboris.eu/ttf2fon/).
## **Button**
---
### Method
```python
buttonA.isPressed()
buttonA.isReleased()
buttonA.pressedFor(timeout)
# if set the callback param, it will interrupt callback function
# or if not set param it will return result at once
buttonA.wasPressed(callback=None)
buttonA.wasReleased(callback=None)
buttonA.releasedFor(timeout, callback=None)
```
### Example
Loop:
```python
from m5stack import *
import utime
while True:
if buttonA.wasPressed():
lcd.print('Button A was Pressed\n')
if buttonA.wasReleased():
lcd.print('Button A was Released\n')
if buttonA.pressedFor(1.5):
lcd.print('Button A pressed for 1.5s\n')
if buttonA.releasedFor(2):
lcd.print('Button A released for 2s press hold\n')
utime.sleep(0.1)
```
Callback:
```python
from m5stack import *
def on_wasPressed():
lcd.print('Button B was Pressed\n')
def on_wasReleased():
lcd.print('Button B was Released\n')
def on_releasedFor():
lcd.print('Button B released for 1.2s press hold\n')
buttonB.wasPressed(on_wasPressed)
buttonB.wasReleased(on_wasReleased)
buttonB.releasedFor(1.2, on_releasedFor)
```
## **SD Card**
---
```python
import uos
uos.mountsd()
uos.listdir('/sd')
```
## **Speaker**
---
```python
from m5stack import *
speaker.volume(2)
speaker.tone(freq=1800)
speaker.tone(freq=1800, duration=200) # Non-blocking
```
## **GPIO**
---
```python
import machine
pinout = machine.Pin(0, machine.Pin.OUT)
pinout.value(1)
pinin = machine.Pin(2, machine.Pin.IN)
val = pinin.value()
```
## **PWM**
---
`pwm = machine.PWM(pin [, freq=f] [, duty=d] [, timer=tm])`
`pwm.init([ freq=f] [, duty=d] [, timer=tm])`
| Arg | Description |
| - | - |
| pin | esp32 GPIO number to be used as pwm output
can be given as integer value or machine.Pin object |
| freq | **optional**, default 5 kHz; pwm frequeny in Hz (1 - 40000000) |
| duty | **optional**, default 50% kHz; pwm duty cycle in % (0 - 100) |
| timer | **optional**, default **0**; pwm timer (0 - 3) |
PWM channel is selected automatically from 8 available pwm channels.
```python
import machine
pwm = machine.PWM(26)
pwm.freq(5000)
pwm.duty(66) # 0.0 ~ 100.0
```
## **ADC**
---
```python
import machine
adc = machine.ADC(35)
adc.read()
```
## **DAC**
---
```python
import machine
dac = machine.DAC(machine.Pin(26))
dac.write(128)
```
## **I2C**
---
```python
from machine import I2C
i2c = I2C(freq=400000, sda=21, scl=22)
# create I2C peripheral at frequency of 400kHz
# depending on the port, extra parameters may be required
# to select the peripheral and/or pins to use
i2c.scan() # scan for slaves, returning a list of 7-bit addresses
i2c.writeto(42, b'123') # write 3 bytes to slave with 7-bit address 42
i2c.readfrom(42, 4) # read 4 bytes from slave with 7-bit address 42
i2c.readfrom_mem(42, 8, 3) # read 3 bytes from memory of slave 42,
# starting at memory-address 8 in the slave
i2c.writeto_mem(42, 2, b'\x10') # write 1 byte to memory of slave 42
# starting at address 2 in the slave
```
## **SPI**
---
```python
from machine import SPI, Pin
spi = SPI(
spihost=SPI.HSPI,
baudrate=2600000
sck=Pin(18),
mosi=Pin(23),
miso=Pin(19),
cs=Pin(4)
)
spi.write(buf) #NOHEAP
spi.read(nbytes, *, write=0x00) #write is the byte to ?output on MOSI for each byte read in
spi.readinto(buf, *, write=0x00) #NOHEAP
spi.write_readinto(write_buf, read_buf) #NOHEAP; write_buf and read_buf can be the same
```
## **UART**
---
```python
from machine import UART
uart2 = UART(2, tx=17, rx=16)
uart2.init(115200, bits=8, parity=None, stop=1)
uart2.read(10) # read 10 characters, returns a bytes object
uart2.read() # read all available characters
uart2.readline() # read a line
uart2.readinto(buf) # read and store into the given buffer
uart2.write('abc') # write the 3 characters
```
## **Timer**
---
tm = machine.Timer(timer_no)
timer_no argument is the timer number to be used for the timer.
It can be 0 - 3 for 4 hardware timers or 4 - 11 for extended timers.
If extended timer is selected, timer 0 must already be configured in EXTBASE mode.
```python
import machine
tcounter = 0
p1 = machine.Pin(27)
p1.init(p1.OUT)
p1.value(1)
def tcb(timer):
global tcounter
if tcounter & 1:
p1.value(0)
else:
p1.value(1)
tcounter += 1
if (tcounter % 10000) == 0:
print("[tcb] timer: {} counter: {}".format(timer.timernum(), tcounter))
t1 = machine.Timer(2)
t1.init(period=20, mode=t1.PERIODIC, callback=tcb)
```
## **Neopixel**
---
```python
import machine, time
np = machine.Neopixel(machine.Pin(22), 24)
def rainbow(loops=120, delay=1, sat=1.0, bri=0.2):
for pos in range(0, loops):
for i in range(0, 24):
dHue = 360.0/24*(pos+i);
hue = dHue % 360;
np.setHSB(i, hue, sat, bri, 1, False)
np.show()
if delay > 0:
time.sleep_ms(delay)
def blinkRainbow(loops=10, delay=250):
for pos in range(0, loops):
for i in range(0, 24):
dHue = 360.0/24*(pos+i);
hue = dHue % 360;
np.setHSB(i, hue, 1.0, 0.1, 1, False)
np.show()
time.sleep_ms(delay)
np.clear()
time.sleep_ms(delay)
```
## **RTC**
---
```python
import machine
import utime
rtc = machine.RTC()
rtc.ntp_sync(server="hr.pool.ntp.org", tz="CET-1CEST")
rtc.synced()
True
utime.gmtime()
(2018, 1, 29, 16, 3, 18, 2, 29)
utime.localtime()
(2018, 1, 29, 17, 3, 30, 2, 29)
```