Compare commits

...

78 Commits

Author SHA1 Message Date
sago35 349b5ca87e WIP: net/http RoundTripper 2022-12-08 22:28:27 +09:00
Lucas Bremgartner c5dbe18be1 lsm303agr: fix I2C address auto increment for multi data read
fixes: #475
2022-10-31 10:02:44 +01:00
Andy Janata 2bca84b8d1 remove unused import 2022-10-29 23:39:52 +02:00
Lucas Bremgartner 690daebcd1 microbitmatrix: add smoke test for microbitmatrix with microbit-v2 2022-10-29 22:49:31 +02:00
Lucas Bremgartner 89770a7d05 microbitmatrix: add support for brightness of led pixels
Inspired by brightness levels in micro:bit MicroPython
2022-10-29 22:49:31 +02:00
Lucas Bremgartner 8a39bb7aae microbitmatrix: harmonize v1 and v2 implementation 2022-10-29 22:49:31 +02:00
Lucas Bremgartner a106fd48ce microbitmatrix: move Size() to verion agnostic part 2022-10-29 22:49:31 +02:00
Lucas Bremgartner b2fdd3c333 microbitmatrix: add link to schema for microbit V2 2022-10-29 22:49:31 +02:00
Ayke van Laethem 42dc6eb068 mpu6050: return I2C error when configuring fails
An I2C bus can generate errors (like any I/O can), but they weren't
returned. This commit fixes this oversight.

Found while trying to figure out why LLVM 15 is broken just for the
itsybitsy-m4.
2022-10-18 20:32:33 +02:00
Rafael Badiale c00cb3abdd qmi8658c: Add support for the QMI8658C sensor (#467)
* Add support for the QMI8658C sensor

* qmi8656c: update ReadTemperature signature

* Update README devices count
2022-10-02 14:14:37 +02:00
deadprogram 81bc1bcad1 all: prepare for release 0.23.0
Signed-off-by: deadprogram <ron@hybridgroup.com>
2022-10-01 23:07:23 +02:00
deadprogram 1bb1b621c6 all: correct go fmt
Signed-off-by: deadprogram <ron@hybridgroup.com>
2022-09-25 13:23:16 +02:00
Lucas Bremgartner 98ba5a231a microbitmatrix: fix inverted axis
Resolves #460
2022-09-24 13:19:37 +02:00
sago35 5af2512901 espat,wifinina,rtl8720dn: change ssid/pass from const to var 2022-09-24 11:34:29 +02:00
Lucas Matte 4061adf6db Add GC9A01 Driver (#452)
* Added driver for gc9a01 round display and example code
2022-09-18 15:22:07 +02:00
Alexandre Jomin 7133c2e9db feat(ssd1306): add getter method to the current buffer 2022-09-16 18:51:10 +02:00
deadprogram 0ea72e7f1e makeybutton: revise to better match the algorithm defined by the original
Signed-off-by: deadprogram <ron@hybridgroup.com>
2022-09-16 18:34:36 +02:00
sago35 7396a5be43 examples/rtl8720dn: remove wifi setting 2022-09-06 13:51:46 +02:00
deadprogram c409e8f3cf examples/rtl8720dn: add call to optional debug setting
Signed-off-by: deadprogram <ron@hybridgroup.com>
2022-09-06 13:29:15 +02:00
deadprogram a6a8d478b9 examples/rtl8720dn: update all remaining examples for refactored API
Signed-off-by: deadprogram <ron@hybridgroup.com>
2022-09-06 13:29:15 +02:00
deadprogram 54ddb895cc rtl8720dn: refactor by bringing this driver more in line with wifinina and espat
Signed-off-by: deadprogram <ron@hybridgroup.com>
2022-09-06 13:29:15 +02:00
Daniel Esteban 6f05615f3e Initial support for VL6180x sensor
required changes
2022-09-05 16:04:30 +02:00
Arsen6331 2a2e897261 Trim quotes from IP returned by espat's GetDNS() 2022-08-19 18:55:09 +02:00
deadprogram ce0ce03cfe all: release 0.22.0
Signed-off-by: deadprogram <ron@hybridgroup.com>
2022-08-16 11:43:34 +02:00
jmacwhyte 5bd814c9de MQTT: adds keepalive pinging, disconnect, and graceful goroutine cleanup 2022-08-10 19:23:36 +02:00
sago35 41b7f06d05 rtl8720dn: add UDP close function 2022-08-08 08:43:57 +02:00
Kenneth Bell 749b2f6726 epd: add waveshare 2.9in (v1) 2022-08-05 21:01:04 +02:00
deadprogram 71c77d4b53 makeybutton: move pin config where it needs to be
Signed-off-by: deadprogram <ron@hybridgroup.com>
2022-07-28 08:31:53 +02:00
deadprogram 1f54c7dd23 makeybutton: use smaller buffer for faster response
Signed-off-by: deadprogram <ron@hybridgroup.com>
2022-07-28 08:31:53 +02:00
deadprogram d0163c67f5 all: update tinyfont to v0.3.0
Signed-off-by: deadprogram <ron@hybridgroup.com>
2022-07-25 17:38:48 +02:00
deadprogram 80cd4d9dac all: update tinyfs to v0.2.0
Signed-off-by: deadprogram <ron@hybridgroup.com>
2022-07-24 17:05:01 +02:00
sago35 594ba1dab2 net/http: support for cookies when https 2022-07-24 16:13:18 +02:00
sago35 625c565c0b rtl8720dn: improve error handling 2022-07-24 12:21:50 +02:00
sago35 b64d4ec3a0 net/http: improve header parsing 2022-07-24 12:09:06 +02:00
sago35 171366698b net/http: Fix http.Get() with port specification 2022-07-23 09:13:55 +02:00
jmacwhyte ca34b93e5d add last-will-and-testament to MQTT 2022-07-22 13:40:44 +02:00
Kamil Wcisło 2cfc08b560 net/mqtt: add support for retained messsages 2022-07-21 13:00:08 +02:00
sago35 1850c5effb rtl8720dn: add ./examples/rtl8720dn/version 2022-07-20 11:38:07 +02:00
Neil Davis 810888ce42 Makefile recursively finds unit-tests
This commit modifies how the Makefile selects dirs for the unit-test target
Instead of assuming all dirs have tests and manually excluding those that don't,
it now recursively finds all dirs containing files with names matching "*_test.go"

A manual exclusion list is maintained for operational use.
2022-07-19 11:58:37 +02:00
deadprogram cafe8df620 makeybutton: add driver for MakeyMakey-like button
Signed-off-by: deadprogram <ron@hybridgroup.com>
2022-07-18 20:44:46 +02:00
Neil Davis 13c43350a3 Fix irremote reporting incorrect NEC addresses and command codes (#422)
Change from reading MSB->LSB to LSB->MSB
Fixes https://github.com/tinygo-org/drivers/issues/422
2022-07-13 12:07:44 +02:00
deadprogram 3edd8e413b build: switching to GHA
Signed-off-by: deadprogram <ron@hybridgroup.com>
2022-07-12 00:15:33 +02:00
deadprogram 159f13974c all: update for release v0.21.0
Signed-off-by: deadprogram <ron@hybridgroup.com>
2022-07-05 11:15:55 +02:00
Neil Davis 8ddcd69ac0 Add support for '8-step mode' to easystepper
Currently, easystepper driver supports only '4-step mode' (12-23-34-41) when energizing the coils
This does not work with all motors & drivers (e.g. 28BJY-48 & ULN2003)

This commit adds support for 8-step mode (1-12-2-23-3-34-4-41)

Note: this commit breaks backward source compatibility for the factory/constructor functions.
2022-06-12 22:19:42 +02:00
deadprogram 1c038f5183 wifinina: add mutex to prevent communication race problems
Signed-off-by: deadprogram <ron@hybridgroup.com>
2022-06-11 10:59:41 +02:00
tgilkerson 36a8b791dc fix(ssd1351): Fix mirrored text on OLED display 2022-06-04 09:13:44 +02:00
Olaf Flebbe df0d0d29a4 ws2812: support thingplus-rp2040 board
Added 125 MHz rp2040 timing
  Added unsafe.Pointer for pointer conversion
2022-05-28 10:22:26 +02:00
Yurii Soldak 3bdab45452 lsm6ds3tr: initial implementation 2022-05-27 07:48:50 +02:00
Olaf Flebbe 9f6783670f sdcard: support thingplus-rp2040
The instances of SPI interfaces SPI0, SPI1, ... are
pointers to SPI types on rp2040 machines, rather plain
values like other machines.

This needs restructuring the sdcard API to take a pointer
to the SPI interface rather the SPI type itself.

Removed waitserial() since it needs modem control lines
not available on most boards
2022-05-24 19:16:34 +02:00
Daniel Esteban ec00fdef9b initial support for UC8151 driver, used in Pimoroni's badger2040 e-paper (#416) 2022-05-24 17:43:07 +02:00
Michael Meister e4951091f4 vl53l1x: Add functions for setting the device address
Implement functions to get and set the device address similar to its
reference implementation in C:
https://github.com/pololu/vl53l1x-arduino/blob/master/VL53L1X.cpp#L28

Signed-off-by: Michael Meister <michael.meister@bytesatwork.ch>
2022-05-18 19:43:30 +02:00
Daniel Esteban 19caee9b76 fixed link to datasheet
fixed temp/humidity values
2022-05-15 07:41:39 +02:00
deadprogram c235509580 scd4x: implement driver for CO2 sensor
Signed-off-by: deadprogram <ron@hybridgroup.com>
2022-05-15 07:41:39 +02:00
deadprogram dbff576c9e all: release 0.20.0
Signed-off-by: deadprogram <ron@hybridgroup.com>
2022-04-28 17:03:38 +02:00
Ayke van Laethem f0a260be66 ws2812: convert AVR assembly to C inline assembly
See https://github.com/tinygo-org/drivers/pull/401 for details.
I haven't converted it to autogenerated assembly because AVR is
different from many other architectures (8-bit, among others) and it
didn't seem worth the effort as many chips run at 16MHz anyway.

I ran the two AVR smoke tests for the ws2812 driver and the resulting
binary is exactly the same.
2022-04-21 11:10:18 +02:00
Ayke van Laethem 06e298c514 ws2812: write inline assembly using C instead of Go
This is better for various reasons:

  * I don't like the inline assembly implementation in TinyGo. It kinda
    works, but it's hard to use correctly.
  * The Go version had a subtle bug: the i and value variables weren't
    marked as modified. The compiler produced correct code by chance. In
    GCC-style inline assembly, it's possible to correctly mark it as an
    input+output operand.
  * LLVM 14 has some changes to inline assembly that change how memory
    operands can be created. Instead of supporting that, I'd like to get
    rid of memory operands entirely (and possibly inline assembly in
    general).

I did some light testing: the ARM assembly changed a bit but not in any
way that should have a practical effect, and the RISC-V assembly didn't
change at all.
2022-04-21 11:10:18 +02:00
Kuiki f2f470973d fix esp8266 ConnectToAccessPoint timeout args 2022-04-21 10:23:21 +02:00
Oliver Stäbler 448598cbf8 vl53l1x: Add functions for setting 'region of interest'
Implement functions to get and set 'region of interest' similar to its
reference implementation in C:
https://github.com/pololu/vl53l1x-arduino/commit/a6de3966784aa07680bb35a1f9ac369959efe19f

Signed-off-by: Oliver Stäbler <oliver.staebler@bytesatwork.ch>
2022-04-21 08:03:22 +02:00
Oliver Stäbler ec98f2dc2c vl53l1x: Fix switch-case semantics
The source code has been ported from C. It seems, the different
semantics of switch-case in Go has not been ported properly.
To fix this, remove 'break' statements and introduce 'fallthrough' where
necessary.

Signed-off-by: Oliver Stäbler <oliver.staebler@bytesatwork.ch>
2022-04-20 20:14:36 +02:00
Patricio Whittingslow 2476cd7bd8 pca9685: fix on=0 bug
Setting on to zero caused PWM signal to be set to high.
2022-04-16 19:14:01 +02:00
Neil Davis 01fed475e1 Add 'irremote' package as a basic infra-red driver
Currently contains an IR Receiver device only.
An IR Sender device will be added shortly

Supports receiving only NEC (extended address) protocol including repeat codes so far
2022-04-11 22:05:57 +02:00
soypat edfdd4e09e add l3gd20 gyro driver 2022-04-08 15:41:46 +02:00
soypat 5e54f08605 pca9685: add buffered one shot write 2022-04-04 17:12:39 +02:00
sago35 880b958d64 ili9341: added Feather board support to InitDisplay() 2022-03-12 08:42:26 +01:00
sago35 24db8b4e2c ili9341: add support for atsame5x 2022-03-11 07:53:30 +01:00
sago35 6df9247f92 ili9341: avoid heap allocations 2022-03-10 20:28:20 +01:00
Elfo404 56fb346438 dht: fix error check in example 2022-03-10 19:10:50 +01:00
Neil Davis 3d279d4d25 Add a SetIntensity() function to max7xx driver and example.
Also remove redundant byte() casts from SetScanLimit()
2022-03-10 18:05:34 +01:00
sago35 4a336f674c image: fix interface 2022-03-10 12:53:44 +01:00
Ayke van Laethem 2d32995f6a ws2812: support high-MHz ARMv6M chips like the RP2040
The possible branch distance is a lot shorter on ARMv6M (Cortex-M and
Cortex-M0+) for conditional branches. Therefore, convert this long
conditional branch into an unconditional branch.

This probably makes the code a little bit slower but because it is in
the low period of the WS2812 signal it shouldn't matter for the
protocol. And it avoids difficult workarounds specifically for the
RP2040.
2022-03-10 10:50:12 +01:00
Anton Fisher 9a98d1be55 drivers: add driver for IS31FL3731 matrix LED driver (#370)
IS31FL3731: add driver for IS31FL3731 matrix LED driver
2022-03-09 13:54:07 +01:00
Donia Chaiehloudj 02e4548966 dht: fix humidity and temperature extraction for DHT22 (#358) 2022-03-08 12:42:28 +01:00
Yurii Soldak 45dce188f5 lsmXXX: unified, error handling, memory management 2022-02-18 06:10:27 +01:00
Steven Pearson b3c0315a09 Driver for SSD1289 LCD 2022-02-18 06:01:55 +01:00
BCG 0ced12683c Revert "Added support for 125MHz to WS2812 for RP2040"
This reverts commit b4eb406a43 (erroneous
push).
2022-02-14 01:06:23 -05:00
BCG b4eb406a43 Added support for 125MHz to WS2812 for RP2040 2022-02-14 00:48:33 -05:00
sago35 10bd48c39d ws2812: add support for m5stamp-c3 2022-02-11 23:47:55 +01:00
Yurii Soldak ad3ef92cfe lps22hb: pin rename, sync with main repo 2022-01-29 23:02:42 +01:00
225 changed files with 9662 additions and 4009 deletions
-20
View File
@@ -1,20 +0,0 @@
# Golang CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-go/ for more details
version: 2
jobs:
build:
docker:
- image: tinygo/tinygo-dev
steps:
- checkout
- run: tinygo version
- run:
name: "Enforce Go Formatted Code"
command: make fmt-check
- run:
name: "Run unit tests"
command: make unit-test
- run:
name: "Run build and smoke tests"
command: make smoke-test
+25
View File
@@ -0,0 +1,25 @@
name: Build
on:
pull_request:
push:
branches:
- dev
- release
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
container: tinygo/tinygo-dev
steps:
- name: Checkout
uses: actions/checkout@v2
- name: TinyGo version check
run: tinygo version
- name: Enforce Go Formatted Code
run: make fmt-check
- name: Run unit tests
run: make unit-test
- name: Run build and smoke tests
run: make smoke-test
+128
View File
@@ -1,3 +1,131 @@
0.23.0
---
- **new devices**
- Add GC9A01 Driver (#452)
- Initial support for VL6180x sensor
- **enhancements**
- **rtl8720dn**
- refactor by bringing this driver more in line with wifinina and espat
- **ssd1306**
- add getter method to the current buffer
- **makeybutton**
- revise to better match the algorithm defined by the original
- **espat,wifinina,rtl8720dn**
- change ssid/pass from const to var
- **bugfixes**
- **microbitmatrix**
- fix inverted axis
- **espat**
- Trim quotes from IP returned by espat's GetDNS()
- **all**
- correct go fmt
- **examples**
- **rtl8720dn**
- remove wifi setting
- add call to optional debug setting
- update all remaining examples for refactored API
0.22.0
---
- **new devices**
- epd: add waveshare 2.9in (v1)
- makeybutton: add driver for MakeyMakey-like button
- **enhancements**
- **rtl8720dn**
- add UDP close function
- improve error handling
- **net/http**
- improve header parsing
- add last-will-and-testament to MQTT
- **net/mqtt**
- adds keepalive pinging, disconnect, and graceful goroutine cleanup
- support for cookies when https
- add support for retained messsages
- **bugfixes**
- irremote: Fix irremote reporting incorrect NEC addresses and command codes (#422)
- net/http: Fix http.Get() with port specification
- **build**
- Makefile recursively finds unit-tests
- switching to GHA
- **updates**
- update tinyfont to v0.3.0
- update tinyfs to v0.2.0
- **examples**
- rtl8720dn: add ./examples/rtl8720dn/version
0.21.0
---
- **new devices**
- lsm6ds3tr: initial implementation
- UC8151: used in Pimoroni's badger2040 e-paper (#416)
- scd4x: implement driver for CO2 sensor
- **enhancements**
- easystepper: Add support for '8-step mode'
- vl53l1x: Add functions for setting the device address
- sdcard: support thingplus-rp2040
- wifinina: add mutex to prevent communication race problems
- **ws2812**
- support thingplus-rp2040 board
- Added 125 MHz rp2040 timing
- Added unsafe.Pointer for pointer conversion
- **bugfixes**
- ssd1351: Fix mirrored text on OLED display
0.20.0
---
- **new devices**
- irremote: Add basic infra-red driver
- IS31FL3731: add driver for IS31FL3731 matrix LED driver (#370)
- l3gd20: add gyro driver
- SSD1289: Driver for SSD1289 LCD
- **enhancements**
- **ili9341**
- add support for atsame5x
- added Feather board support to InitDisplay()
- avoid heap allocations
- **lps22hb**
- pin rename, sync with main repo
- **lsmXXX**
- unified, error handling, memory management
- **max7xx**
- Add a SetIntensity() function to max7xx driver and example
- **vl53l1x**
- Add functions for setting 'region of interest'
- Fix switch-case semantics
- **ws2812**
- add support for m5stamp-c3
- convert AVR assembly to C inline assembly
- support high-MHz ARMv6M chips like the RP2040
- write inline assembly using C instead of Go
- **bugfixes**
- **dht**
- fix error check in example
- fix humidity and temperature extraction for DHT22 (#358)
- **esp8266**
- fix ConnectToAccessPoint timeout args
- **image**
- fix interface
- **pca9685**
- add buffered one shot write
- fix on=0 bug
- **wifinina**
- correct sendParamStr to handle empty strings, such as when connecting to an unsecured access point
0.19.0 0.19.0
--- ---
- **new devices** - **new devices**
+33 -8
View File
@@ -53,6 +53,8 @@ smoke-test:
@md5sum ./build/test.hex @md5sum ./build/test.hex
tinygo build -size short -o ./build/test.hex -target=pyportal ./examples/flash/console/qspi tinygo build -size short -o ./build/test.hex -target=pyportal ./examples/flash/console/qspi
@md5sum ./build/test.hex @md5sum ./build/test.hex
tinygo build -size short -o ./build/test.hex -target=microbit ./examples/gc9a01/main.go
@md5sum ./build/test.hex
tinygo build -size short -o ./build/test.hex -target=feather-m0 ./examples/gps/i2c/main.go tinygo build -size short -o ./build/test.hex -target=feather-m0 ./examples/gps/i2c/main.go
@md5sum ./build/test.hex @md5sum ./build/test.hex
tinygo build -size short -o ./build/test.hex -target=feather-m0 ./examples/gps/uart/main.go tinygo build -size short -o ./build/test.hex -target=feather-m0 ./examples/gps/uart/main.go
@@ -101,12 +103,16 @@ smoke-test:
@md5sum ./build/test.hex @md5sum ./build/test.hex
tinygo build -size short -o ./build/test.hex -target=microbit ./examples/microbitmatrix/main.go tinygo build -size short -o ./build/test.hex -target=microbit ./examples/microbitmatrix/main.go
@md5sum ./build/test.hex @md5sum ./build/test.hex
tinygo build -size short -o ./build/test.hex -target=microbit-v2 ./examples/microbitmatrix/main.go
@md5sum ./build/test.hex
tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/mma8653/main.go tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/mma8653/main.go
@md5sum ./build/test.hex @md5sum ./build/test.hex
tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/mpu6050/main.go tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/mpu6050/main.go
@md5sum ./build/test.hex @md5sum ./build/test.hex
tinygo build -size short -o ./build/test.hex -target=p1am-100 ./examples/p1am/main.go tinygo build -size short -o ./build/test.hex -target=p1am-100 ./examples/p1am/main.go
@md5sum ./build/test.hex @md5sum ./build/test.hex
tinygo build -size short -o ./build/test.hex -target=pico ./examples/pca9685/main.go
@md5sum ./build/test.hex
tinygo build -size short -o ./build/test.hex -target=microbit ./examples/pcd8544/setbuffer/main.go tinygo build -size short -o ./build/test.hex -target=microbit ./examples/pcd8544/setbuffer/main.go
@md5sum ./build/test.hex @md5sum ./build/test.hex
tinygo build -size short -o ./build/test.hex -target=microbit ./examples/pcd8544/setpixel/main.go tinygo build -size short -o ./build/test.hex -target=microbit ./examples/pcd8544/setpixel/main.go
@@ -141,6 +147,8 @@ smoke-test:
@md5sum ./build/test.hex @md5sum ./build/test.hex
tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/vl53l1x/main.go tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/vl53l1x/main.go
@md5sum ./build/test.hex @md5sum ./build/test.hex
tinygo build -size short -o ./build/test.hex -target=itsybitsy-m0 ./examples/vl6180x/main.go
@md5sum ./build/test.hex
tinygo build -size short -o ./build/test.hex -target=microbit ./examples/waveshare-epd/epd2in13/main.go tinygo build -size short -o ./build/test.hex -target=microbit ./examples/waveshare-epd/epd2in13/main.go
@md5sum ./build/test.hex @md5sum ./build/test.hex
tinygo build -size short -o ./build/test.hex -target=microbit ./examples/waveshare-epd/epd2in13x/main.go tinygo build -size short -o ./build/test.hex -target=microbit ./examples/waveshare-epd/epd2in13x/main.go
@@ -157,6 +165,10 @@ smoke-test:
@md5sum ./build/test.hex @md5sum ./build/test.hex
tinygo build -size short -o ./build/test.hex -target=circuitplay-express ./examples/ws2812 tinygo build -size short -o ./build/test.hex -target=circuitplay-express ./examples/ws2812
@md5sum ./build/test.hex @md5sum ./build/test.hex
tinygo build -size short -o ./build/test.bin -target=m5stamp-c3 ./examples/ws2812
@md5sum ./build/test.bin
tinygo build -size short -o ./build/test.hex -target=feather-nrf52840 ./examples/is31fl3731/main.go
@md5sum ./build/test.hex
ifneq ($(AVR), 0) ifneq ($(AVR), 0)
tinygo build -size short -o ./build/test.hex -target=arduino ./examples/ws2812 tinygo build -size short -o ./build/test.hex -target=arduino ./examples/ws2812
@md5sum ./build/test.hex @md5sum ./build/test.hex
@@ -199,6 +211,8 @@ endif
@md5sum ./build/test.hex @md5sum ./build/test.hex
tinygo build -size short -o ./build/test.hex -target=xiao ./examples/pcf8563/timer/ tinygo build -size short -o ./build/test.hex -target=xiao ./examples/pcf8563/timer/
@md5sum ./build/test.hex @md5sum ./build/test.hex
tinygo build -size short -o ./build/test.hex -target=pico ./examples/qmi8658c/main.go
@md5sum ./build/test.hex
tinygo build -size short -o ./build/test.hex -target=feather-m0 ./examples/ina260/main.go tinygo build -size short -o ./build/test.hex -target=feather-m0 ./examples/ina260/main.go
@md5sum ./build/test.hex @md5sum ./build/test.hex
tinygo build -size short -o ./build/test.hex -target=nucleo-l432kc ./examples/aht20/main.go tinygo build -size short -o ./build/test.hex -target=nucleo-l432kc ./examples/aht20/main.go
@@ -225,16 +239,27 @@ endif
@md5sum ./build/test.elf @md5sum ./build/test.elf
tinygo build -size short -o ./build/test.hex -target=nucleo-wl55jc ./examples/sx126x/lora_rxtx/ tinygo build -size short -o ./build/test.hex -target=nucleo-wl55jc ./examples/sx126x/lora_rxtx/
@md5sum ./build/test.hex @md5sum ./build/test.hex
tinygo build -size short -o ./build/test.uf2 -target=pico ./examples/ssd1289/main.go
@md5sum ./build/test.uf2
tinygo build -size short -o ./build/test.hex -target=pico ./examples/irremote/main.go
@md5sum ./build/test.hex
tinygo build -size short -o ./build/test.hex -target=badger2040 ./examples/uc8151/main.go
@md5sum ./build/test.hex
tinygo build -size short -o ./build/test.uf2 -target=pico ./examples/scd4x/main.go
@md5sum ./build/test.uf2
tinygo build -size short -o ./build/test.uf2 -target=circuitplay-express ./examples/makeybutton/main.go
@md5sum ./build/test.uf2
DRIVERS = $(wildcard */) # rwildcard is a recursive version of $(wildcard)
NOTESTS = build examples flash semihosting pcd8544 shiftregister st7789 microphone mcp3008 gps microbitmatrix \ # https://blog.jgc.org/2011/07/gnu-make-recursive-wildcard-function.html
hcsr04 ssd1331 ws2812 thermistor apa102 easystepper ssd1351 ili9341 wifinina shifter hub75 \ rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d))
hd44780 buzzer ssd1306 espat l9110x st7735 bmi160 l293x dht keypad4x4 max72xx p1am tone tm1637 \ # Recursively find all *_test.go files from cwd & reduce to unique dir names
pcf8563 mcp2515 servo sdcard rtl8720dn image cmd i2csoft hts221 lps22hb apds9960 axp192 xpt2046 \ HAS_TESTS = $(sort $(dir $(call rwildcard,,*_test.go)))
ft6336 sx126x # Exclude anything we explicitly don't want to test for whatever reason
TESTS = $(filter-out $(addsuffix /%,$(NOTESTS)),$(DRIVERS)) EXCLUDE_TESTS = image
TESTS = $(filter-out $(addsuffix /%,$(EXCLUDE_TESTS)),$(HAS_TESTS))
unit-test: unit-test:
@go test -v $(addprefix ./,$(TESTS)) @go test -v $(addprefix ./,$(TESTS))
test: clean fmt-check unit-test smoke-test test: clean fmt-check unit-test smoke-test
+93 -82
View File
@@ -1,6 +1,6 @@
# TinyGo Drivers # TinyGo Drivers
[![PkgGoDev](https://pkg.go.dev/badge/tinygo.org/x/drivers)](https://pkg.go.dev/tinygo.org/x/drivers) [![CircleCI](https://circleci.com/gh/tinygo-org/drivers/tree/dev.svg?style=svg)](https://circleci.com/gh/tinygo-org/drivers/tree/dev) [![PkgGoDev](https://pkg.go.dev/badge/tinygo.org/x/drivers)](https://pkg.go.dev/tinygo.org/x/drivers) [![Build](https://github.com/tinygo-org/drivers/actions/workflows/build.yml/badge.svg?branch=dev)](https://github.com/tinygo-org/drivers/actions/workflows/build.yml)
This package provides a collection of hardware drivers for devices such as sensors and displays that can be used together with [TinyGo](https://tinygo.org). This package provides a collection of hardware drivers for devices such as sensors and displays that can be used together with [TinyGo](https://tinygo.org).
@@ -52,89 +52,100 @@ func main() {
## Currently supported devices ## Currently supported devices
The following 78 devices are supported. The following 90 devices are supported.
| Device Name | Interface Type | | Device Name | Interface Type |
|----------|-------------| |-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------|
| [ADT7410 I2C Temperature Sensor](https://www.analog.com/media/en/technical-documentation/data-sheets/ADT7410.pdf) | I2C | | [ADT7410 I2C Temperature Sensor](https://www.analog.com/media/en/technical-documentation/data-sheets/ADT7410.pdf) | I2C |
| [ADXL345 accelerometer](http://www.analog.com/media/en/technical-documentation/data-sheets/ADXL345.pdf) | I2C | | [ADXL345 accelerometer](http://www.analog.com/media/en/technical-documentation/data-sheets/ADXL345.pdf) | I2C |
| [AHT20 I2C Temperature and Humidity Sensor](http://www.aosong.com/userfiles/files/media/AHT20%20%E8%8B%B1%E6%96%87%E7%89%88%E8%AF%B4%E6%98%8E%E4%B9%A6%20A0%2020201222.pdf) | I2C | | [AHT20 I2C Temperature and Humidity Sensor](http://www.aosong.com/userfiles/files/media/AHT20%20%E8%8B%B1%E6%96%87%E7%89%88%E8%AF%B4%E6%98%8E%E4%B9%A6%20A0%2020201222.pdf) | I2C |
| [AMG88xx 8x8 Thermal camera sensor](https://cdn-learn.adafruit.com/assets/assets/000/043/261/original/Grid-EYE_SPECIFICATIONS%28Reference%29.pdf) | I2C | | [AMG88xx 8x8 Thermal camera sensor](https://cdn-learn.adafruit.com/assets/assets/000/043/261/original/Grid-EYE_SPECIFICATIONS%28Reference%29.pdf) | I2C |
| [APA102 RGB LED](https://cdn-shop.adafruit.com/product-files/2343/APA102C.pdf) | SPI | | [APA102 RGB LED](https://cdn-shop.adafruit.com/product-files/2343/APA102C.pdf) | SPI |
| [APDS9960 Digital proximity, ambient light, RGB and gesture sensor](https://cdn.sparkfun.com/assets/learn_tutorials/3/2/1/Avago-APDS-9960-datasheet.pdf) | I2C | | [APDS9960 Digital proximity, ambient light, RGB and gesture sensor](https://cdn.sparkfun.com/assets/learn_tutorials/3/2/1/Avago-APDS-9960-datasheet.pdf) | I2C |
| [AT24CX 2-wire serial EEPROM](https://www.openimpulse.com/blog/wp-content/uploads/wpsc/downloadables/24C32-Datasheet.pdf) | I2C | | [AT24CX 2-wire serial EEPROM](https://www.openimpulse.com/blog/wp-content/uploads/wpsc/downloadables/24C32-Datasheet.pdf) | I2C |
| [AXP192 single Cell Li-Battery and Power System Management](https://github.com/m5stack/M5-Schematic/blob/master/Core/AXP192%20Datasheet_v1.1_en_draft_2211.pdf) | I2C | | [AXP192 single Cell Li-Battery and Power System Management](https://github.com/m5stack/M5-Schematic/blob/master/Core/AXP192%20Datasheet_v1.1_en_draft_2211.pdf) | I2C |
| [BBC micro:bit LED matrix](https://github.com/bbcmicrobit/hardware/blob/master/SCH_BBC-Microbit_V1.3B.pdf) | GPIO | | [BBC micro:bit LED matrix](https://github.com/bbcmicrobit/hardware/blob/master/SCH_BBC-Microbit_V1.3B.pdf) | GPIO |
| [BH1750 ambient light sensor](https://www.mouser.com/ds/2/348/bh1750fvi-e-186247.pdf) | I2C | | [BH1750 ambient light sensor](https://www.mouser.com/ds/2/348/bh1750fvi-e-186247.pdf) | I2C |
| [BlinkM RGB LED](http://thingm.com/fileadmin/thingm/downloads/BlinkM_datasheet.pdf) | I2C | | [BlinkM RGB LED](http://thingm.com/fileadmin/thingm/downloads/BlinkM_datasheet.pdf) | I2C |
| [BME280 humidity/pressure sensor](https://cdn-shop.adafruit.com/datasheets/BST-BME280_DS001-10.pdf) | I2C | | [BME280 humidity/pressure sensor](https://cdn-shop.adafruit.com/datasheets/BST-BME280_DS001-10.pdf) | I2C |
| [BMI160 accelerometer/gyroscope](https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bmi160-ds000.pdf) | SPI | | [BMI160 accelerometer/gyroscope](https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bmi160-ds000.pdf) | SPI |
| [BMP180 barometer](https://cdn-shop.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf) | I2C | | [BMP180 barometer](https://cdn-shop.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf) | I2C |
| [BMP280 temperature/barometer](https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bmp280-ds001.pdf) | I2C | | [BMP280 temperature/barometer](https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bmp280-ds001.pdf) | I2C |
| [BMP388 pressure sensor](https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bmp388-ds001.pdf) | I2C | | [BMP388 pressure sensor](https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bmp388-ds001.pdf) | I2C |
| [Buzzer](https://en.wikipedia.org/wiki/Buzzer#Piezoelectric) | GPIO | | [Buzzer](https://en.wikipedia.org/wiki/Buzzer#Piezoelectric) | GPIO |
| [DHTXX thermometer and humidity sensor](https://cdn-shop.adafruit.com/datasheets/Digital+humidity+and+temperature+sensor+AM2302.pdf) | GPIO | | [DHTXX thermometer and humidity sensor](https://cdn-shop.adafruit.com/datasheets/Digital+humidity+and+temperature+sensor+AM2302.pdf) | GPIO |
| [DS1307 real time clock](https://datasheets.maximintegrated.com/en/ds/DS1307.pdf) | I2C | | [DS1307 real time clock](https://datasheets.maximintegrated.com/en/ds/DS1307.pdf) | I2C |
| [DS3231 real time clock](https://datasheets.maximintegrated.com/en/ds/DS3231.pdf) | I2C | | [DS3231 real time clock](https://datasheets.maximintegrated.com/en/ds/DS3231.pdf) | I2C |
| [ESP32 as WiFi Coprocessor with Arduino nina-fw](https://github.com/arduino/nina-fw) | SPI | | [ESP32 as WiFi Coprocessor with Arduino nina-fw](https://github.com/arduino/nina-fw) | SPI |
| [ESP8266/ESP32 AT Command set for WiFi/TCP/UDP](https://github.com/espressif/esp32-at) | UART | | [ESP8266/ESP32 AT Command set for WiFi/TCP/UDP](https://github.com/espressif/esp32-at) | UART |
| [FT6336 touch controller](https://focuslcds.com/content/FT6236.pdf) | I2C | | [FT6336 touch controller](https://focuslcds.com/content/FT6236.pdf) | I2C |
| [GPS module](https://www.u-blox.com/en/product/neo-6-series) | I2C/UART | | [GPS module](https://www.u-blox.com/en/product/neo-6-series) | I2C/UART |
| [HC-SR04 Ultrasonic distance sensor](https://cdn.sparkfun.com/datasheets/Sensors/Proximity/HCSR04.pdf) | GPIO | | [HC-SR04 Ultrasonic distance sensor](https://cdn.sparkfun.com/datasheets/Sensors/Proximity/HCSR04.pdf) | GPIO |
| [HD44780 LCD controller](https://www.sparkfun.com/datasheets/LCD/HD44780.pdf) | GPIO/I2C | | [HD44780 LCD controller](https://www.sparkfun.com/datasheets/LCD/HD44780.pdf) | GPIO/I2C |
| [HTS221 digital humidity and temperature sensor](https://www.st.com/resource/en/datasheet/hts221.pdf) | I2C | | [HTS221 digital humidity and temperature sensor](https://www.st.com/resource/en/datasheet/hts221.pdf) | I2C |
| [HUB75 RGB led matrix](https://cdn-learn.adafruit.com/downloads/pdf/32x16-32x32-rgb-led-matrix.pdf) | SPI | | [HUB75 RGB led matrix](https://cdn-learn.adafruit.com/downloads/pdf/32x16-32x32-rgb-led-matrix.pdf) | SPI |
| [software I2C driver](https://www.ti.com/lit/an/slva704/slva704.pdf) | GPIO | | [software I2C driver](https://www.ti.com/lit/an/slva704/slva704.pdf) | GPIO |
| [ILI9341 TFT color display](https://cdn-shop.adafruit.com/datasheets/ILI9341.pdf) | SPI | | [ILI9341 TFT color display](https://cdn-shop.adafruit.com/datasheets/ILI9341.pdf) | SPI |
| [INA260 Volt/Amp/Power meter](https://www.ti.com/lit/ds/symlink/ina260.pdf) | I2C | | [INA260 Volt/Amp/Power meter](https://www.ti.com/lit/ds/symlink/ina260.pdf) | I2C |
| [4x4 Membrane Keypad](https://cdn.sparkfun.com/assets/f/f/a/5/0/DS-16038.pdf) | GPIO | | [Infrared remote control](https://en.wikipedia.org/wiki/Consumer_IR) | GPIO |
| [L293x motor driver](https://www.ti.com/lit/ds/symlink/l293d.pdf) | GPIO/PWM | | [IS31FL3731 matrix LED driver](https://www.lumissil.com/assets/pdf/core/IS31FL3731_DS.pdf) | I2C |
| [L9110x motor driver](https://www.elecrow.com/download/datasheet-l9110.pdf) | GPIO/PWM | | [4x4 Membrane Keypad](https://cdn.sparkfun.com/assets/f/f/a/5/0/DS-16038.pdf) | GPIO |
| [LIS2MDL magnetometer](https://www.st.com/resource/en/datasheet/lis2mdl.pdf) | I2C | | [L293x motor driver](https://www.ti.com/lit/ds/symlink/l293d.pdf) | GPIO/PWM |
| [LIS3DH accelerometer](https://www.st.com/resource/en/datasheet/lis3dh.pdf) | I2C | | [L9110x motor driver](https://www.elecrow.com/download/datasheet-l9110.pdf) | GPIO/PWM |
| [LPS22HB MEMS nano pressure sensor](https://www.st.com/resource/en/datasheet/dm00140895.pdf) | I2C | | [LIS2MDL magnetometer](https://www.st.com/resource/en/datasheet/lis2mdl.pdf) | I2C |
| [LSM6DS3 accelerometer](https://www.st.com/resource/en/datasheet/lsm6ds3.pdf) | I2C | | [LIS3DH accelerometer](https://www.st.com/resource/en/datasheet/lis3dh.pdf) | I2C |
| [LSM6DSOX accelerometer](https://www.st.com/resource/en/datasheet/lsm6dsox.pdf) | I2C | | [LPS22HB MEMS nano pressure sensor](https://www.st.com/resource/en/datasheet/dm00140895.pdf) | I2C |
| [LSM303AGR accelerometer](https://www.st.com/resource/en/datasheet/lsm303agr.pdf) | I2C | | [LSM6DS3 accelerometer](https://www.st.com/resource/en/datasheet/lsm6ds3.pdf) | I2C |
| [LSM9DS1 accelerometer](https://www.st.com/resource/en/datasheet/lsm9ds1.pdf) | I2C | | [LSM6DSOX accelerometer](https://www.st.com/resource/en/datasheet/lsm6dsox.pdf) | I2C |
| [MAG3110 magnetometer](https://www.nxp.com/docs/en/data-sheet/MAG3110.pdf) | I2C | | [LSM6DS3TR accelerometer](https://www.st.com/resource/en/datasheet/lsm6ds3tr.pdf) | I2C |
| [MAX7219 & MAX7221 display driver](https://datasheets.maximintegrated.com/en/ds/MAX7219-MAX7221.pdf) | SPI | | [LSM303AGR accelerometer](https://www.st.com/resource/en/datasheet/lsm303agr.pdf) | I2C |
| [MCP2515 Stand-Alone CAN Controller with SPI Interface](https://ww1.microchip.com/downloads/en/DeviceDoc/MCP2515-Family-Data-Sheet-DS20001801K.pdf) | SPI | | [LSM9DS1 accelerometer](https://www.st.com/resource/en/datasheet/lsm9ds1.pdf) | I2C |
| [MCP3008 analog to digital converter (ADC)](http://ww1.microchip.com/downloads/en/DeviceDoc/21295d.pdf) | SPI | | [Makey Button](https://makeymakey.com/) | GPIO |
| [MCP23017 port expander](https://ww1.microchip.com/downloads/en/DeviceDoc/20001952C.pdf) | I2C | | [MAG3110 magnetometer](https://www.nxp.com/docs/en/data-sheet/MAG3110.pdf) | I2C |
| [Microphone - PDM](https://cdn-learn.adafruit.com/assets/assets/000/049/977/original/MP34DT01-M.pdf) | I2S/PDM | | [MAX7219 & MAX7221 display driver](https://datasheets.maximintegrated.com/en/ds/MAX7219-MAX7221.pdf) | SPI |
| [MMA8653 accelerometer](https://www.nxp.com/docs/en/data-sheet/MMA8653FC.pdf) | I2C | | [MCP2515 Stand-Alone CAN Controller with SPI Interface](https://ww1.microchip.com/downloads/en/DeviceDoc/MCP2515-Family-Data-Sheet-DS20001801K.pdf) | SPI |
| [MPU6050 accelerometer/gyroscope](https://store.invensense.com/datasheets/invensense/MPU-6050_DataSheet_V3%204.pdf) | I2C | | [MCP3008 analog to digital converter (ADC)](http://ww1.microchip.com/downloads/en/DeviceDoc/21295d.pdf) | SPI |
| [P1AM-100 Base Controller](https://facts-engineering.github.io/modules/P1AM-100/P1AM-100.html) | SPI | | [MCP23017 port expander](https://ww1.microchip.com/downloads/en/DeviceDoc/20001952C.pdf) | I2C |
| [PCD8544 display](http://eia.udg.edu/~forest/PCD8544_1.pdf) | SPI | | [Microphone - PDM](https://cdn-learn.adafruit.com/assets/assets/000/049/977/original/MP34DT01-M.pdf) | I2S/PDM |
| [PCF8563 real time clock](https://www.nxp.com/docs/en/data-sheet/PCF8563.pdf) | I2C | | [MMA8653 accelerometer](https://www.nxp.com/docs/en/data-sheet/MMA8653FC.pdf) | I2C |
| [Resistive Touchscreen (4-wire)](http://ww1.microchip.com/downloads/en/Appnotes/doc8091.pdf) | GPIO | | [MPU6050 accelerometer/gyroscope](https://store.invensense.com/datasheets/invensense/MPU-6050_DataSheet_V3%204.pdf) | I2C |
| [RTL8720DN 2.4G/5G Dual Bands Wireless and BLE5.0](https://www.seeedstudio.com/Realtek8720DN-2-4G-5G-Dual-Bands-Wireless-and-BLE5-0-Combo-Module-p-4442.html) | UART | | [P1AM-100 Base Controller](https://facts-engineering.github.io/modules/P1AM-100/P1AM-100.html) | SPI |
| [Semihosting](https://wiki.segger.com/Semihosting) | Debug | | [PCD8544 display](http://eia.udg.edu/~forest/PCD8544_1.pdf) | SPI |
| [Servo](https://learn.sparkfun.com/tutorials/hobby-servo-tutorial/all) | PWM | | [PCF8563 real time clock](https://www.nxp.com/docs/en/data-sheet/PCF8563.pdf) | I2C |
| [Shift register (PISO)](https://en.wikipedia.org/wiki/Shift_register#Parallel-in_serial-out_\(PISO\)) | GPIO | | [QMI8658C accelerometer/gyroscope](https://www.qstcorp.com/upload/pdf/202202/%EF%BC%88%E5%B7%B2%E4%BC%A0%EF%BC%89QMI8658C%20datasheet%20rev%200.9.pdf) | I2C |
| [Shift registers (SIPO)](https://en.wikipedia.org/wiki/Shift_register#Serial-in_parallel-out_(SIPO)) | GPIO | | [Resistive Touchscreen (4-wire)](http://ww1.microchip.com/downloads/en/Appnotes/doc8091.pdf) | GPIO |
| [RTL8720DN 2.4G/5G Dual Bands Wireless and BLE5.0](https://www.seeedstudio.com/Realtek8720DN-2-4G-5G-Dual-Bands-Wireless-and-BLE5-0-Combo-Module-p-4442.html) | UART |
| [SCD4x CO2 Sensor](https://sensirion.com/media/documents/C4B87CE6/627C2DCD/CD_DS_SCD40_SCD41_Datasheet_D1.pdf) | I2C |
| [Semihosting](https://wiki.segger.com/Semihosting) | Debug |
| [Servo](https://learn.sparkfun.com/tutorials/hobby-servo-tutorial/all) | PWM |
| [Shift register (PISO)](https://en.wikipedia.org/wiki/Shift_register#Parallel-in_serial-out_\(PISO\)) | GPIO |
| [Shift registers (SIPO)](https://en.wikipedia.org/wiki/Shift_register#Serial-in_parallel-out_(SIPO)) | GPIO |
| [SHT3x Digital Humidity Sensor](https://www.sensirion.com/fileadmin/user_upload/customers/sensirion/Dokumente/2_Humidity_Sensors/Datasheets/Sensirion_Humidity_Sensors_SHT3x_Datasheet_digital.pdf) | I2C | | [SHT3x Digital Humidity Sensor](https://www.sensirion.com/fileadmin/user_upload/customers/sensirion/Dokumente/2_Humidity_Sensors/Datasheets/Sensirion_Humidity_Sensors_SHT3x_Datasheet_digital.pdf) | I2C |
| [SHTC3 Digital Humidity Sensor (RH/T)](https://www.sensirion.com/fileadmin/user_upload/customers/sensirion/Dokumente/2_Humidity_Sensors/Datasheets/Sensirion_Humidity_Sensors_SHTC3_Datasheet.pdf) | I2C | | [SHTC3 Digital Humidity Sensor (RH/T)](https://www.sensirion.com/fileadmin/user_upload/customers/sensirion/Dokumente/2_Humidity_Sensors/Datasheets/Sensirion_Humidity_Sensors_SHTC3_Datasheet.pdf) | I2C |
| [SPI NOR Flash Memory](https://en.wikipedia.org/wiki/Flash_memory#NOR_flash) | SPI/QSPI | | [SPI NOR Flash Memory](https://en.wikipedia.org/wiki/Flash_memory#NOR_flash) | SPI/QSPI |
| [SPI SDCARD/MMC](https://en.wikipedia.org/wiki/SD_card) | SPI | | [SPI SDCARD/MMC](https://en.wikipedia.org/wiki/SD_card) | SPI |
| [SSD1306 OLED display](https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf) | I2C / SPI | | [SSD1306 OLED display](https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf) | I2C / SPI |
| [SSD1331 TFT color display](https://www.crystalfontz.com/controllers/SolomonSystech/SSD1331/381/) | SPI | | [SSD1331 TFT color display](https://www.crystalfontz.com/controllers/SolomonSystech/SSD1331/381/) | SPI |
| [SSD1351 OLED display](https://download.mikroe.com/documents/datasheets/ssd1351-revision-1.3.pdf) | SPI | | [SSD1351 OLED display](https://download.mikroe.com/documents/datasheets/ssd1351-revision-1.3.pdf) | SPI |
| [ST7735 TFT color display](https://www.crystalfontz.com/controllers/Sitronix/ST7735R/319/) | SPI | | [ST7735 TFT color display](https://www.crystalfontz.com/controllers/Sitronix/ST7735R/319/) | SPI |
| [ST7789 TFT color display](https://cdn-shop.adafruit.com/product-files/3787/3787_tft_QT154H2201__________20190228182902.pdf) | SPI | | [ST7789 TFT color display](https://cdn-shop.adafruit.com/product-files/3787/3787_tft_QT154H2201__________20190228182902.pdf) | SPI |
| [Stepper motor "Easystepper" controller](https://en.wikipedia.org/wiki/Stepper_motor) | GPIO | | [Stepper motor "Easystepper" controller](https://en.wikipedia.org/wiki/Stepper_motor) | GPIO |
| [Thermistor](https://www.farnell.com/datasheets/33552.pdf) | ADC | | [Thermistor](https://www.farnell.com/datasheets/33552.pdf) | ADC |
| [TM1637 7-segment LED display](https://www.mcielectronics.cl/website_MCI/static/documents/Datasheet_TM1637.pdf) | I2C | | [TM1637 7-segment LED display](https://www.mcielectronics.cl/website_MCI/static/documents/Datasheet_TM1637.pdf) | I2C |
| [TMP102 I2C Temperature Sensor](https://download.mikroe.com/documents/datasheets/tmp102-data-sheet.pdf) | I2C | | [TMP102 I2C Temperature Sensor](https://download.mikroe.com/documents/datasheets/tmp102-data-sheet.pdf) | I2C |
| [VEML6070 UV light sensor](https://www.vishay.com/docs/84277/veml6070.pdf) | I2C | | [UC8151 All-in-one driver IC for ESL](https://www.buydisplay.com/download/ic/UC8151C.pdf) | I2C |
| [VL53L1X time-of-flight distance sensor](https://www.st.com/resource/en/datasheet/vl53l1x.pdf) | I2C | | [VEML6070 UV light sensor](https://www.vishay.com/docs/84277/veml6070.pdf) | I2C |
| [Waveshare 2.13" (B & C) e-paper display](https://www.waveshare.com/w/upload/d/d3/2.13inch-e-paper-b-Specification.pdf) | SPI | | [VL53L1X time-of-flight distance sensor](https://www.st.com/resource/en/datasheet/vl53l1x.pdf) | I2C |
| [Waveshare 2.13" e-paper display](https://www.waveshare.com/w/upload/e/e6/2.13inch_e-Paper_Datasheet.pdf) | SPI | | [VL6180X time-of-flight distance sensor](https://www.st.com/resource/en/datasheet/vl6180x.pdf) | I2C |
| [Waveshare 4.2" e-paper B/W display](https://www.waveshare.com/w/upload/6/6a/4.2inch-e-paper-specification.pdf) | SPI | | [Waveshare 2.13" (B & C) e-paper display](https://www.waveshare.com/w/upload/d/d3/2.13inch-e-paper-b-Specification.pdf) | SPI |
| [WS2812 RGB LED](https://cdn-shop.adafruit.com/datasheets/WS2812.pdf) | GPIO | | [Waveshare 2.13" e-paper display](https://www.waveshare.com/w/upload/e/e6/2.13inch_e-Paper_Datasheet.pdf) | SPI |
| [XPT2046 touch controller](http://grobotronics.com/images/datasheets/xpt2046-datasheet.pdf) | GPIO | | [Waveshare 2.9" e-paper display (V1)](https://www.waveshare.com/w/upload/e/e6/2.9inch_e-Paper_Datasheet.pdf) | SPI |
| [Semtech SX126x Lora](https://www.semtech.com/products/wireless-rf/lora-transceiv-ers/sx1261) | SPI | | [Waveshare 4.2" e-paper B/W display](https://www.waveshare.com/w/upload/6/6a/4.2inch-e-paper-specification.pdf) | SPI |
| [Waveshare GC9A01 TFT round display](https://www.waveshare.com/w/upload/5/5e/GC9A01A.pdf) | SPI |
| [WS2812 RGB LED](https://cdn-shop.adafruit.com/datasheets/WS2812.pdf) | GPIO |
| [XPT2046 touch controller](http://grobotronics.com/images/datasheets/xpt2046-datasheet.pdf) | GPIO |
| [Semtech SX126x Lora](https://www.semtech.com/products/wireless-rf/lora-transceiv-ers/sx1261) | SPI |
| [SSD1289 TFT color display](http://aitendo3.sakura.ne.jp/aitendo_data/product_img/lcd/tft2/M032C1289TP/3.2-SSD1289.pdf) | GPIO |
## Contributing ## Contributing
-1
View File
@@ -1,7 +1,6 @@
// Package adt7410 provides a driver for the adt7410 I2C Temperature Sensor. // Package adt7410 provides a driver for the adt7410 I2C Temperature Sensor.
// //
// Datasheet: https://www.analog.com/media/en/technical-documentation/data-sheets/ADT7410.pdf // Datasheet: https://www.analog.com/media/en/technical-documentation/data-sheets/ADT7410.pdf
//
package adt7410 // import "tinygo.org/x/drivers/adt7410" package adt7410 // import "tinygo.org/x/drivers/adt7410"
import ( import (
-1
View File
@@ -3,7 +3,6 @@
// Datasheet EN: http://www.analog.com/media/en/technical-documentation/data-sheets/ADXL345.pdf // Datasheet EN: http://www.analog.com/media/en/technical-documentation/data-sheets/ADXL345.pdf
// //
// Datasheet JP: http://www.analog.com/media/jp/technical-documentation/data-sheets/ADXL345_jp.pdf // Datasheet JP: http://www.analog.com/media/jp/technical-documentation/data-sheets/ADXL345_jp.pdf
//
package adxl345 // import "tinygo.org/x/drivers/adxl345" package adxl345 // import "tinygo.org/x/drivers/adxl345"
import "tinygo.org/x/drivers" import "tinygo.org/x/drivers"
-1
View File
@@ -2,7 +2,6 @@
// a digital proximity, ambient light, RGB and gesture sensor. // a digital proximity, ambient light, RGB and gesture sensor.
// //
// Datasheet: https://cdn.sparkfun.com/assets/learn_tutorials/3/2/1/Avago-APDS-9960-datasheet.pdf // Datasheet: https://cdn.sparkfun.com/assets/learn_tutorials/3/2/1/Avago-APDS-9960-datasheet.pdf
//
package apds9960 package apds9960
import ( import (
-2
View File
@@ -3,8 +3,6 @@
package apds9960 package apds9960
import "tinygo.org/x/drivers"
// Configure sets up the APDS-9960 device. // Configure sets up the APDS-9960 device.
func (d *Device) Configure(cfg Configuration) { func (d *Device) Configure(cfg Configuration) {
// configure device // configure device
-1
View File
@@ -3,7 +3,6 @@
// //
// http://www.x-powers.com/en.php/Info/product_detail/article_id/29 // http://www.x-powers.com/en.php/Info/product_detail/article_id/29
// Datasheet: https://github.com/m5stack/M5-Schematic/blob/master/Core/AXP192%20Datasheet_v1.1_en_draft_2211.pdf // Datasheet: https://github.com/m5stack/M5-Schematic/blob/master/Core/AXP192%20Datasheet_v1.1_en_draft_2211.pdf
//
package axp192 // import "tinygo.org/x/drivers/axp192" package axp192 // import "tinygo.org/x/drivers/axp192"
import ( import (
-1
View File
@@ -2,7 +2,6 @@
// //
// Datasheet: // Datasheet:
// https://www.mouser.com/ds/2/348/bh1750fvi-e-186247.pdf // https://www.mouser.com/ds/2/348/bh1750fvi-e-186247.pdf
//
package bh1750 // import "tinygo.org/x/drivers/bh1750" package bh1750 // import "tinygo.org/x/drivers/bh1750"
import ( import (
-1
View File
@@ -1,7 +1,6 @@
// Package blinkm implements a driver for the BlinkM I2C RGB LED. // Package blinkm implements a driver for the BlinkM I2C RGB LED.
// //
// Datasheet: http://thingm.com/fileadmin/thingm/downloads/BlinkM_datasheet.pdf // Datasheet: http://thingm.com/fileadmin/thingm/downloads/BlinkM_datasheet.pdf
//
package blinkm // import "tinygo.org/x/drivers/blinkm" package blinkm // import "tinygo.org/x/drivers/blinkm"
import "tinygo.org/x/drivers" import "tinygo.org/x/drivers"
+2 -2
View File
@@ -3,7 +3,6 @@
// //
// Datasheet: // Datasheet:
// https://cdn-shop.adafruit.com/datasheets/BST-BME280_DS001-10.pdf // https://cdn-shop.adafruit.com/datasheets/BST-BME280_DS001-10.pdf
//
package bme280 package bme280
import ( import (
@@ -149,7 +148,8 @@ func (d *Device) ReadHumidity() (int32, error) {
// ReadAltitude returns the current altitude in meters based on the // ReadAltitude returns the current altitude in meters based on the
// current barometric pressure and estimated pressure at sea level. // current barometric pressure and estimated pressure at sea level.
// Calculation is based on code from Adafruit BME280 library // Calculation is based on code from Adafruit BME280 library
// https://github.com/adafruit/Adafruit_BME280_Library //
// https://github.com/adafruit/Adafruit_BME280_Library
func (d *Device) ReadAltitude() (alt int32, err error) { func (d *Device) ReadAltitude() (alt int32, err error) {
mPa, _ := d.ReadPressure() mPa, _ := d.ReadPressure()
atmP := float32(mPa) / 100000 atmP := float32(mPa) / 100000
-1
View File
@@ -3,7 +3,6 @@
// //
// Datasheet: // Datasheet:
// https://cdn-shop.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf // https://cdn-shop.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf
//
package bmp180 // import "tinygo.org/x/drivers/bmp180" package bmp180 // import "tinygo.org/x/drivers/bmp180"
import ( import (
-1
View File
@@ -1,5 +1,4 @@
// Package buzzer provides a very simplistic driver for a connected buzzer or low-fidelity speaker. // Package buzzer provides a very simplistic driver for a connected buzzer or low-fidelity speaker.
//
package buzzer // import "tinygo.org/x/drivers/buzzer" package buzzer // import "tinygo.org/x/drivers/buzzer"
import ( import (
+3 -27
View File
@@ -1,3 +1,6 @@
//go:build tinygo
// +build tinygo
// Package dht provides a driver for DHTXX family temperature and humidity sensors. // Package dht provides a driver for DHTXX family temperature and humidity sensors.
// //
// [1] Datasheet DHT11: https://www.mouser.com/datasheet/2/758/DHT11-Technical-Data-Sheet-Translated-Version-1143054.pdf // [1] Datasheet DHT11: https://www.mouser.com/datasheet/2/758/DHT11-Technical-Data-Sheet-Translated-Version-1143054.pdf
@@ -7,34 +10,10 @@
package dht // import "tinygo.org/x/drivers/dht" package dht // import "tinygo.org/x/drivers/dht"
import ( import (
"encoding/binary"
"machine" "machine"
"time" "time"
) )
// enum type for device type
type DeviceType uint8
// DeviceType specific parsing of information received from the sensor
func (d DeviceType) extractData(buf []byte) (temp int16, hum uint16) {
if d == DHT11 {
temp = int16(buf[2])
if buf[3]&0x80 > 0 {
temp = -1 - temp
}
temp *= 10
temp += int16(buf[3] & 0x0f)
hum = 10*uint16(buf[0]) + uint16(buf[1])
} else {
hum = binary.LittleEndian.Uint16(buf[0:2])
temp = int16(buf[3])<<8 + int16(buf[2]&0x7f)
if buf[2]&0x80 > 0 {
temp = -temp
}
}
return
}
// Celsius and Fahrenheit temperature scales // Celsius and Fahrenheit temperature scales
type TemperatureScale uint8 type TemperatureScale uint8
@@ -54,9 +33,6 @@ const (
startTimeout = time.Millisecond * 200 startTimeout = time.Millisecond * 200
startingLow = time.Millisecond * 20 startingLow = time.Millisecond * 20
DHT11 DeviceType = iota
DHT22
C TemperatureScale = iota C TemperatureScale = iota
F F
+44
View File
@@ -0,0 +1,44 @@
package dht
import (
"encoding/binary"
)
// DeviceType is the enum type for device type
type DeviceType uint8
const (
DHT11 DeviceType = iota
DHT22
)
// extractData parses information received from the sensor.
// The 2 first buffers are for the humidity and
// the 2 following corresponds to the temperature.
func (d DeviceType) extractData(buf []byte) (temp int16, hum uint16) {
switch d {
case DHT11:
hum = 10*uint16(buf[0]) + uint16(buf[1])
temp = int16(buf[2])
if buf[3]&0x80 > 0 {
temp = -1 - temp
}
temp *= 10
temp += int16(buf[3] & 0x0f)
case DHT22:
hum = binary.BigEndian.Uint16(buf[0:2])
temp = int16(buf[2]&0x7f)<<8 + int16(buf[3])
// the first bit corresponds to the sign bit
if buf[2]&0x80 > 0 {
temp = -temp
}
default:
// keeping this for retro-compatibility but not tested
hum = binary.LittleEndian.Uint16(buf[0:2])
temp = int16(buf[3])<<8 + int16(buf[2]&0x7f)
if buf[2]&0x80 > 0 {
temp = -temp
}
}
return
}
+46
View File
@@ -0,0 +1,46 @@
package dht
import (
"testing"
)
func TestDeviceType_extractData(t *testing.T) {
bitStr := "0000001010001100000000010101111111101110"
buf := bitStringToBytes(bitStr)
tt := []struct {
name string
d DeviceType
buf []byte
wantTemp int16
wantHum uint16
}{
{
// temp = 35.1C hum = 65.2%
name: "DHT22", d: DHT22, buf: buf, wantTemp: 351, wantHum: 652,
},
}
for _, tc := range tt {
t.Run(tc.name, func(t *testing.T) {
gotTemp, gotHum := tc.d.extractData(tc.buf)
if gotTemp != tc.wantTemp {
t.Errorf("extractData() gotTemp = %v, want %v", gotTemp, tc.wantTemp)
}
if gotHum != tc.wantHum {
t.Errorf("extractData() gotHum = %v, want %v", gotHum, tc.wantHum)
}
})
}
}
func bitStringToBytes(s string) []byte {
b := make([]byte, (len(s)+(8-1))/8)
for i, r := range s {
if r < '0' || r > '1' {
panic("not in range")
}
b[i>>3] |= byte(r-'0') << uint(7-i&7)
}
return b
}
+3
View File
@@ -1,3 +1,6 @@
//go:build tinygo
// +build tinygo
// Package dht provides a driver for DHTXX family temperature and humidity sensors. // Package dht provides a driver for DHTXX family temperature and humidity sensors.
// //
// [1] Datasheet DHT11: https://www.mouser.com/datasheet/2/758/DHT11-Technical-Data-Sheet-Translated-Version-1143054.pdf // [1] Datasheet DHT11: https://www.mouser.com/datasheet/2/758/DHT11-Technical-Data-Sheet-Translated-Version-1143054.pdf
+3
View File
@@ -1,3 +1,6 @@
//go:build tinygo
// +build tinygo
// Package dht provides a driver for DHTXX family temperature and humidity sensors. // Package dht provides a driver for DHTXX family temperature and humidity sensors.
// //
// [1] Datasheet DHT11: https://www.mouser.com/datasheet/2/758/DHT11-Technical-Data-Sheet-Translated-Version-1143054.pdf // [1] Datasheet DHT11: https://www.mouser.com/datasheet/2/758/DHT11-Technical-Data-Sheet-Translated-Version-1143054.pdf
+3
View File
@@ -1,3 +1,6 @@
//go:build tinygo
// +build tinygo
package dht // import "tinygo.org/x/drivers/dht" package dht // import "tinygo.org/x/drivers/dht"
import ( import (
+7 -8
View File
@@ -3,22 +3,22 @@
// //
// Here is an example in TinyGo that uses the BMP180 digital barometer: // Here is an example in TinyGo that uses the BMP180 digital barometer:
// //
// package main // package main
// //
// import ( // import (
// "time" // "time"
// "machine" // "machine"
// //
// "tinygo.org/x/drivers/bmp180" // "tinygo.org/x/drivers/bmp180"
// ) // )
// //
// func main() { // func main() {
// machine.I2C0.Configure(machine.I2CConfig{}) // machine.I2C0.Configure(machine.I2CConfig{})
// sensor := bmp180.New(machine.I2C0) // sensor := bmp180.New(machine.I2C0)
// sensor.Configure() // sensor.Configure()
// //
// connected := sensor.Connected() // connected := sensor.Connected()
// if !connected { // if !connected {
// println("BMP180 not detected") // println("BMP180 not detected")
// return // return
// } // }
@@ -38,5 +38,4 @@
// Each individual driver is contained within its own sub-package within this package and // Each individual driver is contained within its own sub-package within this package and
// there are no interdependencies in order to minimize the final size of compiled code that // there are no interdependencies in order to minimize the final size of compiled code that
// uses any of these drivers. // uses any of these drivers.
//
package drivers // import "tinygo.org/x/drivers" package drivers // import "tinygo.org/x/drivers"
-1
View File
@@ -2,7 +2,6 @@
// //
// Datasheet: // Datasheet:
// https://datasheets.maximintegrated.com/en/ds/DS1307.pdf // https://datasheets.maximintegrated.com/en/ds/DS1307.pdf
//
package ds1307 // import "tinygo.org/x/drivers/ds1307" package ds1307 // import "tinygo.org/x/drivers/ds1307"
import ( import (
+138 -22
View File
@@ -2,28 +2,76 @@
package easystepper // import "tinygo.org/x/drivers/easystepper" package easystepper // import "tinygo.org/x/drivers/easystepper"
import ( import (
"errors"
"machine" "machine"
"time" "time"
) )
// StepMode determines the coil sequence used to perform a single step
type StepMode uint8
// Valid values for StepMode
const (
// ModeFour uses a 'four step' coil sequence (12-23-34-41). This is the default (zero-value) mode
ModeFour StepMode = iota
// ModeEight uses an 'eight step' coil sequence (1-12-2-23-3-34-4-41)
ModeEight
)
// stepCount is a helper function to return the number of steps in a StepMode sequence
func (sm StepMode) stepCount() uint {
switch sm {
default:
fallthrough
case ModeFour:
return 4
case ModeEight:
return 8
}
}
// DeviceConfig contains the configuration data for a single easystepper driver
type DeviceConfig struct {
// Pin1 ... Pin4 determines the pins to configure and use for the device
Pin1, Pin2, Pin3, Pin4 machine.Pin
// StepCount is the number of steps required to perform a full revolution of the stepper motor
StepCount uint
// RPM determines the speed of the stepper motor in 'Revolutions per Minute'
RPM uint
// Mode determines the coil sequence used to perform a single step
Mode StepMode
}
// DualDeviceConfig contains the configuration data for a dual easystepper driver
type DualDeviceConfig struct {
DeviceConfig
// Pin5 ... Pin8 determines the pins to configure and use for the second device
Pin5, Pin6, Pin7, Pin8 machine.Pin
}
// Device holds the pins and the delay between steps // Device holds the pins and the delay between steps
type Device struct { type Device struct {
pins [4]machine.Pin pins [4]machine.Pin
stepDelay int32 stepDelay time.Duration
stepNumber uint8 stepNumber uint8
stepMode StepMode
} }
// DualDevice holds information for controlling 2 motors // DualDevice holds information for controlling 2 motors
type DualDevice struct { type DualDevice struct {
devices [2]Device devices [2]*Device
} }
// New returns a new easystepper driver given 4 pins, number of steps and rpm // New returns a new single easystepper driver given a DeviceConfig
func New(pin1, pin2, pin3, pin4 machine.Pin, steps int32, rpm int32) Device { func New(config DeviceConfig) (*Device, error) {
return Device{ if config.StepCount == 0 || config.RPM == 0 {
pins: [4]machine.Pin{pin1, pin2, pin3, pin4}, return nil, errors.New("config.StepCount and config.RPM must be > 0")
stepDelay: 60000000 / (steps * rpm),
} }
return &Device{
pins: [4]machine.Pin{config.Pin1, config.Pin2, config.Pin3, config.Pin4},
stepDelay: time.Second * 60 / time.Duration((config.StepCount * config.RPM)),
stepMode: config.Mode,
}, nil
} }
// Configure configures the pins of the Device // Configure configures the pins of the Device
@@ -34,17 +82,23 @@ func (d *Device) Configure() {
} }
// NewDual returns a new dual easystepper driver given 8 pins, number of steps and rpm // NewDual returns a new dual easystepper driver given 8 pins, number of steps and rpm
func NewDual(pin1, pin2, pin3, pin4, pin5, pin6, pin7, pin8 machine.Pin, steps int32, rpm int32) DualDevice { func NewDual(config DualDeviceConfig) (*DualDevice, error) {
var dual DualDevice // Create the first device
dual.devices[0] = Device{ dev1, err := New(config.DeviceConfig)
pins: [4]machine.Pin{pin1, pin2, pin3, pin4}, if err != nil {
stepDelay: 60000000 / (steps * rpm), return nil, err
} }
dual.devices[1] = Device{ // Create the second device
pins: [4]machine.Pin{pin5, pin6, pin7, pin8}, config.DeviceConfig.Pin1 = config.Pin5
stepDelay: 60000000 / (steps * rpm), config.DeviceConfig.Pin2 = config.Pin6
config.DeviceConfig.Pin3 = config.Pin7
config.DeviceConfig.Pin4 = config.Pin8
dev2, err := New(config.DeviceConfig)
if err != nil {
return nil, err
} }
return dual // Return composite dual device
return &DualDevice{devices: [2]*Device{dev1, dev2}}, nil
} }
// Configure configures the pins of the DualDevice // Configure configures the pins of the DualDevice
@@ -64,7 +118,7 @@ func (d *Device) Move(steps int32) {
var s int32 var s int32
d.stepMotor(d.stepNumber) d.stepMotor(d.stepNumber)
for s = int32(d.stepNumber); s < steps; s++ { for s = int32(d.stepNumber); s < steps; s++ {
time.Sleep(time.Duration(d.stepDelay) * time.Microsecond) time.Sleep(d.stepDelay)
d.moveDirectionSteps(direction, s) d.moveDirectionSteps(direction, s)
} }
} }
@@ -101,7 +155,7 @@ func (d *DualDevice) Move(stepsA, stepsB int32) {
stepsA += int32(d.devices[max].stepNumber) stepsA += int32(d.devices[max].stepNumber)
minStep = int32(d.devices[min].stepNumber) minStep = int32(d.devices[min].stepNumber)
for s := int32(d.devices[max].stepNumber); s < stepsA; s++ { for s := int32(d.devices[max].stepNumber); s < stepsA; s++ {
time.Sleep(time.Duration(d.devices[0].stepDelay) * time.Microsecond) time.Sleep(d.devices[0].stepDelay)
d.devices[max].moveDirectionSteps(directions[max], s) d.devices[max].moveDirectionSteps(directions[max], s)
if ((s * stepsB) / stepsA) > minStep { if ((s * stepsB) / stepsA) > minStep {
@@ -119,6 +173,18 @@ func (d *DualDevice) Off() {
// stepMotor changes the pins' state to the correct step // stepMotor changes the pins' state to the correct step
func (d *Device) stepMotor(step uint8) { func (d *Device) stepMotor(step uint8) {
switch d.stepMode {
default:
fallthrough
case ModeFour:
d.stepMotor4(step)
case ModeEight:
d.stepMotor8(step)
}
}
// stepMotor4 changes the pins' state to the correct step in 4-step mode
func (d *Device) stepMotor4(step uint8) {
switch step { switch step {
case 0: case 0:
d.pins[0].High() d.pins[0].High()
@@ -148,13 +214,63 @@ func (d *Device) stepMotor(step uint8) {
d.stepNumber = step d.stepNumber = step
} }
// stepMotor8 changes the pins' state to the correct step in 8-step mode
func (d *Device) stepMotor8(step uint8) {
switch step {
case 0:
d.pins[0].High()
d.pins[2].Low()
d.pins[1].Low()
d.pins[3].Low()
case 1:
d.pins[0].High()
d.pins[2].High()
d.pins[1].Low()
d.pins[3].Low()
case 2:
d.pins[0].Low()
d.pins[2].High()
d.pins[1].Low()
d.pins[3].Low()
case 3:
d.pins[0].Low()
d.pins[2].High()
d.pins[1].High()
d.pins[3].Low()
case 4:
d.pins[0].Low()
d.pins[2].Low()
d.pins[1].High()
d.pins[3].Low()
case 5:
d.pins[0].Low()
d.pins[2].Low()
d.pins[1].High()
d.pins[3].High()
case 6:
d.pins[0].Low()
d.pins[2].Low()
d.pins[1].Low()
d.pins[3].High()
case 7:
d.pins[0].High()
d.pins[2].Low()
d.pins[1].Low()
d.pins[3].High()
}
d.stepNumber = step
}
// moveDirectionSteps uses the direction to calculate the correct step and change the motor to it. // moveDirectionSteps uses the direction to calculate the correct step and change the motor to it.
// Direction true: 0, 1, 2, 3, 0, 1, 2, ... // Direction true: (4-step mode) 0, 1, 2, 3, 0, 1, 2, ...
// Direction false: 0, 3, 2, 1, 0, 3, 2, ... // Direction false: (4-step mode) 0, 3, 2, 1, 0, 3, 2, ...
// Direction true: (8-step mode) 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, ...
// Direction false: (8-step mode) 0, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, ...
func (d *Device) moveDirectionSteps(direction bool, step int32) { func (d *Device) moveDirectionSteps(direction bool, step int32) {
modulus := int32(d.stepMode.stepCount())
if direction { if direction {
d.stepMotor(uint8(step % 4)) d.stepMotor(uint8(step % modulus))
} else { } else {
d.stepMotor(uint8((step + 2*(step%2)) % 4)) d.stepMotor(uint8(((-step % modulus) + modulus) % modulus))
} }
} }
+1 -1
View File
@@ -12,7 +12,7 @@ func (d *Device) ConnectToAccessPoint(ssid, pass string, timeout time.Duration)
} }
d.SetWifiMode(WifiModeClient) d.SetWifiMode(WifiModeClient)
return d.ConnectToAP(ssid, pass, 10) return d.ConnectToAP(ssid, pass, int(timeout.Seconds()))
} }
func (d *Device) Disconnect() error { func (d *Device) Disconnect() error {
-1
View File
@@ -15,7 +15,6 @@
// //
// AT command set: // AT command set:
// https://www.espressif.com/sites/default/files/documentation/4a-esp8266_at_instruction_set_en.pdf // https://www.espressif.com/sites/default/files/documentation/4a-esp8266_at_instruction_set_en.pdf
//
package espat // import "tinygo.org/x/drivers/espat" package espat // import "tinygo.org/x/drivers/espat"
import ( import (
+1 -1
View File
@@ -29,7 +29,7 @@ func (d *Device) GetDNS(domain string) (string, error) {
return "", errors.New("Invalid domain lookup result") return "", errors.New("Invalid domain lookup result")
} }
res := strings.Split(r[1], "\r\n") res := strings.Split(r[1], "\r\n")
return res[0], nil return strings.Trim(res[0], `"`), nil
} }
// ConnectTCPSocket creates a new TCP socket connection for the ESP8266/ESP32. // ConnectTCPSocket creates a new TCP socket connection for the ESP8266/ESP32.
+1 -1
View File
@@ -12,7 +12,7 @@ func main() {
dhtSensor := dht.New(pin, dht.DHT11) dhtSensor := dht.New(pin, dht.DHT11)
for { for {
temp, hum, err := dhtSensor.Measurements() temp, hum, err := dhtSensor.Measurements()
if err != nil { if err == nil {
fmt.Printf("Temperature: %02d.%d°C, Humidity: %02d.%d%%\n", temp/10, temp%10, hum/10, hum%10) fmt.Printf("Temperature: %02d.%d°C, Humidity: %02d.%d%%\n", temp/10, temp%10, hum/10, hum%10)
} else { } else {
fmt.Printf("Could not take measurements from the sensor: %s\n", err.Error()) fmt.Printf("Could not take measurements from the sensor: %s\n", err.Error())
+5 -1
View File
@@ -8,7 +8,11 @@ import (
) )
func main() { func main() {
motor := easystepper.New(machine.P13, machine.P15, machine.P14, machine.P16, 200, 75) config := easystepper.DeviceConfig{
Pin1: machine.P13, Pin2: machine.P15, Pin3: machine.P14, Pin4: machine.P16,
StepCount: 200, RPM: 75, Mode: easystepper.ModeFour,
}
motor, _ := easystepper.New(config)
motor.Configure() motor.Configure()
for { for {
+5 -4
View File
@@ -6,7 +6,6 @@
// //
// More information on the Espressif AT command set at: // More information on the Espressif AT command set at:
// https://www.espressif.com/sites/default/files/documentation/4a-esp8266_at_instruction_set_en.pdf // https://www.espressif.com/sites/default/files/documentation/4a-esp8266_at_instruction_set_en.pdf
//
package main package main
import ( import (
@@ -19,9 +18,11 @@ import (
// change actAsAP to true to act as an access point instead of connecting to one. // change actAsAP to true to act as an access point instead of connecting to one.
const actAsAP = false const actAsAP = false
// access point info var (
const ssid = "YOURSSID" // access point info
const pass = "YOURPASS" ssid string
pass string
)
// these are the default pins for the Arduino Nano33 IoT. // these are the default pins for the Arduino Nano33 IoT.
// change these to connect to a different UART or pins for the ESP8266/ESP32 // change these to connect to a different UART or pins for the ESP8266/ESP32
+5 -4
View File
@@ -3,7 +3,6 @@
// //
// In other words: // In other words:
// Your computer <--> UART0 <--> MCU <--> UART1 <--> ESP8266 <--> INTERNET // Your computer <--> UART0 <--> MCU <--> UART1 <--> ESP8266 <--> INTERNET
//
package main package main
import ( import (
@@ -17,9 +16,11 @@ import (
// change actAsAP to true to act as an access point instead of connecting to one. // change actAsAP to true to act as an access point instead of connecting to one.
const actAsAP = false const actAsAP = false
// access point info var (
const ssid = "YOURSSID" // access point info
const pass = "YOURPASS" ssid string
pass string
)
// these are the default pins for the Arduino Nano33 IoT. // these are the default pins for the Arduino Nano33 IoT.
// change these to connect to a different UART or pins for the ESP8266/ESP32 // change these to connect to a different UART or pins for the ESP8266/ESP32
+5 -4
View File
@@ -3,7 +3,6 @@
// //
// In other words: // In other words:
// Your computer <--> UART0 <--> MCU <--> UART1 <--> ESP8266 // Your computer <--> UART0 <--> MCU <--> UART1 <--> ESP8266
//
package main package main
import ( import (
@@ -14,9 +13,11 @@ import (
"tinygo.org/x/drivers/net" "tinygo.org/x/drivers/net"
) )
// access point info var (
const ssid = "YOURSSID" // access point info
const pass = "YOURPASS" ssid string
pass string
)
// IP address of the listener aka "hub". Replace with your own info. // IP address of the listener aka "hub". Replace with your own info.
const hubIP = "0.0.0.0" const hubIP = "0.0.0.0"
+6 -5
View File
@@ -7,8 +7,7 @@
// //
// You must install the Paho MQTT package to build this program: // You must install the Paho MQTT package to build this program:
// //
// go get -u github.com/eclipse/paho.mqtt.golang // go get -u github.com/eclipse/paho.mqtt.golang
//
package main package main
import ( import (
@@ -20,9 +19,11 @@ import (
"tinygo.org/x/drivers/net/mqtt" "tinygo.org/x/drivers/net/mqtt"
) )
// access point info var (
const ssid = "YOURSSID" // access point info
const pass = "YOURPASS" ssid string
pass string
)
// IP address of the MQTT broker to use. Replace with your own info. // IP address of the MQTT broker to use. Replace with your own info.
const server = "tcp://test.mosquitto.org:1883" const server = "tcp://test.mosquitto.org:1883"
+6 -5
View File
@@ -7,8 +7,7 @@
// //
// You must also install the Paho MQTT package to build this program: // You must also install the Paho MQTT package to build this program:
// //
// go get -u github.com/eclipse/paho.mqtt.golang // go get -u github.com/eclipse/paho.mqtt.golang
//
package main package main
import ( import (
@@ -21,9 +20,11 @@ import (
"tinygo.org/x/drivers/net/mqtt" "tinygo.org/x/drivers/net/mqtt"
) )
// access point info var (
const ssid = "YOURSSID" // access point info
const pass = "YOURPASS" ssid string
pass string
)
// IP address of the MQTT broker to use. Replace with your own info. // IP address of the MQTT broker to use. Replace with your own info.
//const server = "tcp://test.mosquitto.org:1883" //const server = "tcp://test.mosquitto.org:1883"
+5 -4
View File
@@ -3,7 +3,6 @@
// //
// In other words: // In other words:
// Your computer <--> UART0 <--> MCU <--> UART1 <--> ESP8266 // Your computer <--> UART0 <--> MCU <--> UART1 <--> ESP8266
//
package main package main
import ( import (
@@ -14,9 +13,11 @@ import (
"tinygo.org/x/drivers/net" "tinygo.org/x/drivers/net"
) )
// access point info var (
const ssid = "YOURSSID" // access point info
const pass = "YOURPASS" ssid string
pass string
)
// IP address of the server aka "hub". Replace with your own info. // IP address of the server aka "hub". Replace with your own info.
const serverIP = "0.0.0.0" const serverIP = "0.0.0.0"
+39
View File
@@ -0,0 +1,39 @@
package main
import (
"machine"
"time"
"image/color"
"tinygo.org/x/drivers/gc9a01"
)
func main() {
machine.SPI0.Configure(machine.SPIConfig{
Frequency: 80000000,
})
display := gc9a01.New(machine.SPI0, machine.P6, machine.P7, machine.P8, machine.P9)
display.Configure(gc9a01.Config{Orientation: gc9a01.HORIZONTAL, Width: 240, Height: 240})
width, height := display.Size()
white := color.RGBA{255, 255, 255, 255}
red := color.RGBA{255, 0, 0, 255}
blue := color.RGBA{0, 0, 255, 255}
green := color.RGBA{0, 255, 0, 255}
black := color.RGBA{0, 0, 0, 255}
display.FillScreen(black)
display.FillRectangle(0, 0, width/2, height/2, white)
display.FillRectangle(width/2, 0, width/2, height/2, red)
display.FillRectangle(0, height/2, width/2, height/2, green)
display.FillRectangle(width/2, height/2, width/2, height/2, blue)
display.FillRectangle(width/4, height/4, width/2, height/2, black)
for {
time.Sleep(time.Hour)
}
}
-2
View File
@@ -9,8 +9,6 @@ import (
"tinygo.org/x/drivers/ili9341" "tinygo.org/x/drivers/ili9341"
) )
var ()
func InitDisplay() *ili9341.Device { func InitDisplay() *ili9341.Device {
machine.SPI0.Configure(machine.SPIConfig{ machine.SPI0.Configure(machine.SPIConfig{
SCK: machine.SPI0_SCK_PIN, SCK: machine.SPI0_SCK_PIN,
+42
View File
@@ -0,0 +1,42 @@
//go:build feather_m0 || feather_m4 || feather_m4_can || feather_nrf52840 || feather_nrf52840_sense || feather_stm32f405 || feather_rp2040
// +build feather_m0 feather_m4 feather_m4_can feather_nrf52840 feather_nrf52840_sense feather_stm32f405 feather_rp2040
package initdisplay
import (
"machine"
"tinygo.org/x/drivers/ili9341"
)
func InitDisplay() *ili9341.Device {
machine.D5.Configure(machine.PinConfig{Mode: machine.PinOutput})
machine.D6.Configure(machine.PinConfig{Mode: machine.PinOutput})
machine.SPI0.Configure(machine.SPIConfig{
SCK: machine.SPI0_SCK_PIN,
SDO: machine.SPI0_SDO_PIN,
SDI: machine.SPI0_SDI_PIN,
Frequency: 40000000,
})
// configure backlight
backlight := machine.D9
backlight.Configure(machine.PinConfig{machine.PinOutput})
display := ili9341.NewSPI(
machine.SPI0,
machine.D10, // LCD_DC,
machine.D11, // LCD_SS_PIN,
machine.D12, // LCD_RESET,
)
// configure display
display.Configure(ili9341.Config{})
backlight.High()
display.SetRotation(ili9341.Rotation270)
return display
}
+4 -2
View File
@@ -72,7 +72,8 @@ func drawPng(display *ili9341.Device) error {
} }
}) })
return png.Decode(p) _, err := png.Decode(p)
return err
} }
func drawJpeg(display *ili9341.Device) error { func drawJpeg(display *ili9341.Device) error {
@@ -84,7 +85,8 @@ func drawJpeg(display *ili9341.Device) error {
} }
}) })
return jpeg.Decode(p) _, err := jpeg.Decode(p)
return err
} }
func errorMessage(err error) { func errorMessage(err error) {
+58
View File
@@ -0,0 +1,58 @@
package main
import (
"machine"
"time"
"tinygo.org/x/drivers/irremote"
)
var irCmdButtons = map[uint16]string{
0x45: "POWER",
0x47: "FUNC/STOP",
0x46: "VOL+",
0x44: "FAST BACK",
0x40: "PAUSE",
0x43: "FAST FORWARD",
0x07: "DOWN",
0x15: "VOL-",
0x09: "UP",
0x19: "EQ",
0x0D: "ST/REPT",
0x16: "0",
0x0C: "1",
0x18: "2",
0x5E: "3",
0x08: "4",
0x1C: "5",
0x5A: "6",
0x42: "7",
0x52: "8",
0x4A: "9",
}
var (
pinIRIn = machine.GP26
ir irremote.ReceiverDevice
)
func setupPins() {
ir = irremote.NewReceiver(pinIRIn)
ir.Configure()
}
func irCallback(data irremote.Data) {
msg := "Command: " + irCmdButtons[data.Command]
if data.Flags&irremote.DataFlagIsRepeat != 0 {
msg = msg + " (REPEAT)"
}
println(msg)
}
func main() {
setupPins()
ir.SetCommandHandler(irCallback)
for {
time.Sleep(time.Millisecond * 10)
}
}
+51
View File
@@ -0,0 +1,51 @@
package main
import (
"time"
"machine"
"tinygo.org/x/drivers/is31fl3731"
)
// I2CAddress -- address of led matrix
var I2CAddress uint8 = is31fl3731.I2C_ADDRESS_74
func main() {
bus := machine.I2C0
err := bus.Configure(machine.I2CConfig{})
if err != nil {
println("could not configure I2C:", err)
return
}
// Create driver for Adafruit 15x7 CharliePlex LED Matrix FeatherWing
// (CharlieWing): https://www.adafruit.com/product/3163
ledMatrix := is31fl3731.NewAdafruitCharlieWing15x7(bus, I2CAddress)
err = ledMatrix.Configure()
if err != nil {
println("could not configure is31fl3731 driver:", err)
return
}
// Fill the whole matrix on the frame #0 (visible by default)
ledMatrix.Fill(is31fl3731.FRAME_0, uint8(3))
// Draw couple pixels on the frame #1 (not visible yet)
ledMatrix.DrawPixelXY(is31fl3731.FRAME_1, uint8(0), uint8(0), uint8(10))
ledMatrix.DrawPixelXY(is31fl3731.FRAME_1, uint8(14), uint8(6), uint8(10))
// There are 8 frames available, it's a good idea to draw on an invisible
// frame and then switch to that frame to reduce flickering. Switch between
// frame #0 and #1 in a loop to show animation:
for {
println("show frame #0...")
ledMatrix.SetActiveFrame(is31fl3731.FRAME_0)
time.Sleep(time.Second * 3)
println("show frame #1...")
ledMatrix.SetActiveFrame(is31fl3731.FRAME_1)
time.Sleep(time.Second * 3)
}
}
+39
View File
@@ -0,0 +1,39 @@
package main
import (
"machine"
"time"
"tinygo.org/x/drivers/l3gd20"
)
func main() {
const (
// Default address on most breakout boards.
pcaAddr = 0x40
)
bus := machine.I2C0
err := bus.Configure(machine.I2CConfig{})
if err != nil {
panic(err.Error())
}
gyro := l3gd20.NewI2C(bus, 105)
err = gyro.Configure(l3gd20.Config{Range: l3gd20.Range_250})
if err != nil {
println(err.Error())
}
var x, y, z int32
for {
err = gyro.Update()
if err != nil {
println(err.Error())
}
x, y, z = gyro.AngularVelocity()
println(x, y, z)
time.Sleep(500 * time.Millisecond)
}
}
+16 -8
View File
@@ -13,7 +13,13 @@ func main() {
machine.I2C0.Configure(machine.I2CConfig{}) machine.I2C0.Configure(machine.I2CConfig{})
sensor := lsm303agr.New(machine.I2C0) sensor := lsm303agr.New(machine.I2C0)
sensor.Configure(lsm303agr.Configuration{}) //default settings err := sensor.Configure(lsm303agr.Configuration{}) //default settings
if err != nil {
for {
println("Failed to configure", err.Error())
time.Sleep(time.Second)
}
}
// you can specify the following options to adjust accuracy, sensor range or save power. // you can specify the following options to adjust accuracy, sensor range or save power.
// see https://github.com/tinygo-org/drivers/blob/release/lsm303agr/registers.go for details: // see https://github.com/tinygo-org/drivers/blob/release/lsm303agr/registers.go for details:
@@ -28,22 +34,24 @@ func main() {
}) })
*/ */
if !sensor.Connected() {
println("LSM303AGR/MAG not connected!")
return
}
for { for {
if !sensor.Connected() {
println("LSM303AGR/MAG not connected!")
time.Sleep(time.Second)
continue
}
// accel_x, accel_y, accel_z := sensor.ReadAcceleration() // accel_x, accel_y, accel_z := sensor.ReadAcceleration()
// println("ACCEL_X:", accel_x/100000, " ACCEL_Y:", accel_y/100000, " ACCEL_Z:", accel_z/100000) // println("ACCEL_X:", accel_x/100000, " ACCEL_Y:", accel_y/100000, " ACCEL_Z:", accel_z/100000)
// mag_x, mag_y, mag_z := sensor.ReadMagneticField() // mag_x, mag_y, mag_z := sensor.ReadMagneticField()
// println("MAG_X:", mag_x/100000, " MAG_Y:", mag_y/100000, " MAG_Z:", mag_z/100000) // println("MAG_X:", mag_x/100000, " MAG_Y:", mag_y/100000, " MAG_Z:", mag_z/100000)
pitch, roll := sensor.ReadPitchRoll() pitch, roll, _ := sensor.ReadPitchRoll()
println("Pitch:", float32(pitch)/100000, " Roll:", float32(roll)/100000) println("Pitch:", float32(pitch)/100000, " Roll:", float32(roll)/100000)
heading := sensor.ReadCompass() heading, _ := sensor.ReadCompass()
println("Heading:", float32(heading)/100000, "degrees") println("Heading:", float32(heading)/100000, "degrees")
temp, _ := sensor.ReadTemperature() temp, _ := sensor.ReadTemperature()
+13 -6
View File
@@ -12,16 +12,23 @@ func main() {
machine.I2C0.Configure(machine.I2CConfig{}) machine.I2C0.Configure(machine.I2CConfig{})
accel := lsm6ds3.New(machine.I2C0) accel := lsm6ds3.New(machine.I2C0)
accel.Configure(lsm6ds3.Configuration{}) err := accel.Configure(lsm6ds3.Configuration{})
if !accel.Connected() { if err != nil {
println("LSM6DS3 not connected") for {
return println("Failed to configure", err.Error())
time.Sleep(time.Second)
}
} }
for { for {
x, y, z := accel.ReadAcceleration() if !accel.Connected() {
println("LSM6DS3 not connected")
time.Sleep(time.Second)
continue
}
x, y, z, _ := accel.ReadAcceleration()
println("Acceleration:", float32(x)/1000000, float32(y)/1000000, float32(z)/1000000) println("Acceleration:", float32(x)/1000000, float32(y)/1000000, float32(z)/1000000)
x, y, z = accel.ReadRotation() x, y, z, _ = accel.ReadRotation()
println("Gyroscope:", float32(x)/1000000, float32(y)/1000000, float32(z)/1000000) println("Gyroscope:", float32(x)/1000000, float32(y)/1000000, float32(z)/1000000)
x, _ = accel.ReadTemperature() x, _ = accel.ReadTemperature()
println("Degrees C", float32(x)/1000, "\n\n") println("Degrees C", float32(x)/1000, "\n\n")
+37
View File
@@ -0,0 +1,37 @@
// Connects to an LSM6DS3TR I2C a 6 axis Inertial Measurement Unit (IMU)
package main
import (
"machine"
"time"
"tinygo.org/x/drivers/lsm6ds3tr"
)
func main() {
machine.I2C0.Configure(machine.I2CConfig{})
accel := lsm6ds3tr.New(machine.I2C0)
err := accel.Configure(lsm6ds3tr.Configuration{})
if err != nil {
for {
println("Failed to configure", err.Error())
time.Sleep(time.Second)
}
}
for {
if !accel.Connected() {
println("LSM6DS3TR not connected")
time.Sleep(time.Second)
continue
}
x, y, z, _ := accel.ReadAcceleration()
println("Acceleration:", float32(x)/1000000, float32(y)/1000000, float32(z)/1000000)
x, y, z, _ = accel.ReadRotation()
println("Gyroscope:", float32(x)/1000000, float32(y)/1000000, float32(z)/1000000)
x, _ = accel.ReadTemperature()
println("Degrees C", float32(x)/1000, "\n\n")
time.Sleep(time.Millisecond * 1000)
}
}
+10 -4
View File
@@ -26,12 +26,18 @@ func main() {
machine.I2C0.Configure(machine.I2CConfig{}) machine.I2C0.Configure(machine.I2CConfig{})
device := lsm6dsox.New(machine.I2C0) device := lsm6dsox.New(machine.I2C0)
device.Configure(lsm6dsox.Configuration{ err := device.Configure(lsm6dsox.Configuration{
AccelRange: lsm6dsox.ACCEL_2G, AccelRange: lsm6dsox.ACCEL_2G,
AccelSampleRate: lsm6dsox.ACCEL_SR_104, AccelSampleRate: lsm6dsox.ACCEL_SR_104,
GyroRange: lsm6dsox.GYRO_250DPS, GyroRange: lsm6dsox.GYRO_250DPS,
GyroSampleRate: lsm6dsox.GYRO_SR_104, GyroSampleRate: lsm6dsox.GYRO_SR_104,
}) })
if err != nil {
for {
println("Failed to configure", err.Error())
time.Sleep(time.Second)
}
}
for { for {
@@ -46,8 +52,8 @@ func main() {
calibrateGyro(device) calibrateGyro(device)
} }
ax, ay, az := device.ReadAcceleration() ax, ay, az, _ := device.ReadAcceleration()
gx, gy, gz := device.ReadRotation() gx, gy, gz, _ := device.ReadRotation()
t, _ := device.ReadTemperature() t, _ := device.ReadTemperature()
if PLOTTER { if PLOTTER {
@@ -64,7 +70,7 @@ func main() {
func calibrateGyro(device *lsm6dsox.Device) { func calibrateGyro(device *lsm6dsox.Device) {
for i := 0; i < 100; i++ { for i := 0; i < 100; i++ {
gx, gy, gz := device.ReadRotation() gx, gy, gz, _ := device.ReadRotation()
cal[0] += float32(gx) / 1000000 cal[0] += float32(gx) / 1000000
cal[1] += float32(gy) / 1000000 cal[1] += float32(gy) / 1000000
cal[2] += float32(gz) / 1000000 cal[2] += float32(gz) / 1000000
+1 -1
View File
@@ -41,7 +41,7 @@ func main() {
for { for {
if con, err := device.Connected(); !con || err != nil { if !device.Connected() {
println("LSM9DS1 not connected") println("LSM9DS1 not connected")
time.Sleep(time.Second) time.Sleep(time.Second)
continue continue
+31
View File
@@ -0,0 +1,31 @@
package main
import (
"machine"
"time"
"tinygo.org/x/drivers/makeybutton"
)
var (
led machine.Pin = machine.LED
button machine.Pin = machine.D10
key *makeybutton.Button
)
func main() {
led.Configure(machine.PinConfig{Mode: machine.PinOutput})
key = makeybutton.NewButton(button)
key.Configure()
for {
switch key.Get() {
case makeybutton.Pressed:
led.High()
case makeybutton.Released:
led.Low()
}
// the more frequent the more responsive
time.Sleep(50 * time.Millisecond)
}
}
+1
View File
@@ -29,6 +29,7 @@ func main() {
driver.StopDisplayTest() driver.StopDisplayTest()
driver.SetDecodeMode(4) driver.SetDecodeMode(4)
driver.SetScanLimit(4) driver.SetScanLimit(4)
driver.SetIntensity(8)
driver.StopShutdownMode() driver.StopShutdownMode()
for i := 1; i < int(digitNumber); i++ { for i := 1; i < int(digitNumber); i++ {
-1
View File
@@ -2,7 +2,6 @@
// to read data from the onboard MEMS microphone. // to read data from the onboard MEMS microphone.
// //
// Uses ideas from the https://github.com/adafruit/Adafruit_CircuitPlayground repo. // Uses ideas from the https://github.com/adafruit/Adafruit_CircuitPlayground repo.
//
package main package main
import ( import (
+66
View File
@@ -0,0 +1,66 @@
// Connects to an QMI8658C I2C accelerometer/gyroscope and print the read data.
// This example was made with the "WaveShare RP2040 Round LCD 1.28in" in mind.
// For more infor about this development board:
// https://www.waveshare.com/wiki/RP2040-LCD-1.28
package main
import (
"machine"
"time"
imu "tinygo.org/x/drivers/qmi8658c"
)
func main() {
i2c := machine.I2C1
// This is the default pinout for the "WaveShare RP2040 Round LCD 1.28in"
err := i2c.Configure(machine.I2CConfig{
SDA: machine.GP6,
SCL: machine.GP7,
Frequency: 100000,
})
if err != nil {
println("unable to configure I2C:", err)
return
}
// Create a new device
d := imu.New(i2c)
// Check if the device is connected
if !d.Connected() {
println("unable to connect to sensor")
return
}
// This IMU has multiple configurations like output data rate, multiple
// measurements scales, low pass filters, low power modes, all the vailable
// values can be found in the datasheet and were defined at registers file.
// This is the default configuration which will be used if the `nil` value
// is passed do the `Configure` method.
config := imu.Config{
SPIMode: imu.SPI_4_WIRE,
SPIEndian: imu.SPI_BIG_ENDIAN,
SPIAutoInc: imu.SPI_AUTO_INC,
AccEnable: imu.ACC_ENABLE,
AccScale: imu.ACC_8G,
AccRate: imu.ACC_NORMAL_1000HZ,
AccLowPass: imu.ACC_LOW_PASS_2_62,
GyroEnable: imu.GYRO_FULL_ENABLE,
GyroScale: imu.GYRO_512DPS,
GyroRate: imu.GYRO_1000HZ,
GyroLowPass: imu.GYRO_LOW_PASS_2_62,
}
d.Configure(config)
// Read the accelation, rotation and temperature data and print them.
for {
acc_x, acc_y, acc_z := d.ReadAcceleration()
gyro_x, gyro_y, gyro_z := d.ReadRotation()
temp, _ := d.ReadTemperature()
println("-------------------------------")
println("acc:", acc_x, acc_y, acc_z)
println("gyro:", gyro_x, gyro_y, gyro_z)
println("temp:", temp)
time.Sleep(time.Millisecond * 100)
}
}
+16 -16
View File
@@ -7,15 +7,16 @@
// //
// You must install the Paho MQTT package to build this program: // You must install the Paho MQTT package to build this program:
// //
// go get -u github.com/eclipse/paho.mqtt.golang // go get -u github.com/eclipse/paho.mqtt.golang
// //
// You can check that mqttpub is running successfully with the following command. // You can check that mqttpub is running successfully with the following command.
// //
// mosquitto_sub -h test.mosquitto.org -t tinygo // mosquitto_sub -h test.mosquitto.org -t tinygo
//
package main package main
import ( import (
"machine"
"fmt" "fmt"
"math/rand" "math/rand"
"time" "time"
@@ -28,23 +29,23 @@ import (
// You can override the setting with the init() in another source code. // You can override the setting with the init() in another source code.
// func init() { // func init() {
// ssid = "your-ssid" // ssid = "your-ssid"
// password = "your-password" // pass = "your-password"
// debug = true // debug = true
// server = "tinygo.org" // server = "tinygo.org"
// } // }
var ( var (
ssid string ssid string
password string pass string
server string = "tcp://test.mosquitto.org:1883" server string = "tcp://test.mosquitto.org:1883"
debug = false debug = false
) )
var buf [0x400]byte var buf [0x400]byte
var lastRequestTime time.Time var lastRequestTime time.Time
var conn net.Conn var conn net.Conn
var adaptor *rtl8720dn.RTL8720DN var adaptor *rtl8720dn.Driver
func main() { func main() {
err := run() err := run()
@@ -59,18 +60,17 @@ var (
) )
func run() error { func run() error {
rtl, err := setupRTL8720DN() // change the UART and pins as needed for platforms other than the WioTerminal.
if err != nil { adaptor = rtl8720dn.New(machine.UART3, machine.PB24, machine.PC24, machine.RTL8720D_CHIP_PU)
return err adaptor.Debug(debug)
} adaptor.Configure()
net.UseDriver(rtl)
err = rtl.ConnectToAccessPoint(ssid, password, 10*time.Second) err := adaptor.ConnectToAccessPoint(ssid, pass, 10*time.Second)
if err != nil { if err != nil {
return err return err
} }
ip, subnet, gateway, err := rtl.GetIP() ip, subnet, gateway, err := adaptor.GetIP()
if err != nil { if err != nil {
return err return err
} }
@@ -1,74 +0,0 @@
//go:build wioterminal
// +build wioterminal
package main
import (
"device/sam"
"machine"
"runtime/interrupt"
"time"
"tinygo.org/x/drivers/rtl8720dn"
)
var (
uart UARTx
)
func handleInterrupt(interrupt.Interrupt) {
// should reset IRQ
uart.Receive(byte((uart.Bus.DATA.Get() & 0xFF)))
uart.Bus.INTFLAG.SetBits(sam.SERCOM_USART_INT_INTFLAG_RXC)
}
func setupRTL8720DN() (*rtl8720dn.RTL8720DN, error) {
machine.RTL8720D_CHIP_PU.Configure(machine.PinConfig{Mode: machine.PinOutput})
machine.RTL8720D_CHIP_PU.Low()
time.Sleep(100 * time.Millisecond)
machine.RTL8720D_CHIP_PU.High()
time.Sleep(1000 * time.Millisecond)
if debug {
waitSerial()
}
uart = UARTx{
UART: &machine.UART{
Buffer: machine.NewRingBuffer(),
Bus: sam.SERCOM0_USART_INT,
SERCOM: 0,
},
}
uart.Interrupt = interrupt.New(sam.IRQ_SERCOM0_2, handleInterrupt)
uart.Configure(machine.UARTConfig{TX: machine.PB24, RX: machine.PC24, BaudRate: 614400})
rtl := rtl8720dn.New(uart)
rtl.Debug(debug)
_, err := rtl.Rpc_tcpip_adapter_init()
if err != nil {
return nil, err
}
return rtl, nil
}
// Wait for user to open serial console
func waitSerial() {
for !machine.Serial.DTR() {
time.Sleep(100 * time.Millisecond)
}
}
type UARTx struct {
*machine.UART
}
func (u UARTx) Read(p []byte) (n int, err error) {
if u.Buffered() == 0 {
time.Sleep(1 * time.Millisecond)
return 0, nil
}
return u.UART.Read(p)
}
+17 -17
View File
@@ -7,16 +7,17 @@
// //
// You must also install the Paho MQTT package to build this program: // You must also install the Paho MQTT package to build this program:
// //
// go get -u github.com/eclipse/paho.mqtt.golang // go get -u github.com/eclipse/paho.mqtt.golang
// //
// You can check that mqttpub/mqttsub is running successfully with the following command. // You can check that mqttpub/mqttsub is running successfully with the following command.
// //
// mosquitto_sub -h test.mosquitto.org -t tinygo/tx // mosquitto_sub -h test.mosquitto.org -t tinygo/tx
// mosquitto_pub -h test.mosquitto.org -t tinygo/rx -m "hello world" // mosquitto_pub -h test.mosquitto.org -t tinygo/rx -m "hello world"
//
package main package main
import ( import (
"machine"
"fmt" "fmt"
"math/rand" "math/rand"
"time" "time"
@@ -29,23 +30,23 @@ import (
// You can override the setting with the init() in another source code. // You can override the setting with the init() in another source code.
// func init() { // func init() {
// ssid = "your-ssid" // ssid = "your-ssid"
// password = "your-password" // pass = "your-password"
// debug = true // debug = true
// server = "tinygo.org" // server = "tinygo.org"
// } // }
var ( var (
ssid string ssid string
password string pass string
server string = "tcp://test.mosquitto.org:1883" server string = "tcp://test.mosquitto.org:1883"
debug = false debug = false
) )
var buf [0x400]byte var buf [0x400]byte
var lastRequestTime time.Time var lastRequestTime time.Time
var conn net.Conn var conn net.Conn
var adaptor *rtl8720dn.RTL8720DN var adaptor *rtl8720dn.Driver
func main() { func main() {
err := run() err := run()
@@ -68,18 +69,17 @@ func subHandler(client mqtt.Client, msg mqtt.Message) {
} }
func run() error { func run() error {
rtl, err := setupRTL8720DN() // change the UART and pins as needed for platforms other than the WioTerminal.
if err != nil { adaptor = rtl8720dn.New(machine.UART3, machine.PB24, machine.PC24, machine.RTL8720D_CHIP_PU)
return err adaptor.Debug(debug)
} adaptor.Configure()
net.UseDriver(rtl)
err = rtl.ConnectToAccessPoint(ssid, password, 10*time.Second) err := adaptor.ConnectToAccessPoint(ssid, pass, 10*time.Second)
if err != nil { if err != nil {
return err return err
} }
ip, subnet, gateway, err := rtl.GetIP() ip, subnet, gateway, err := adaptor.GetIP()
if err != nil { if err != nil {
return err return err
} }
-74
View File
@@ -1,74 +0,0 @@
//go:build wioterminal
// +build wioterminal
package main
import (
"device/sam"
"machine"
"runtime/interrupt"
"time"
"tinygo.org/x/drivers/rtl8720dn"
)
var (
uart UARTx
)
func handleInterrupt(interrupt.Interrupt) {
// should reset IRQ
uart.Receive(byte((uart.Bus.DATA.Get() & 0xFF)))
uart.Bus.INTFLAG.SetBits(sam.SERCOM_USART_INT_INTFLAG_RXC)
}
func setupRTL8720DN() (*rtl8720dn.RTL8720DN, error) {
machine.RTL8720D_CHIP_PU.Configure(machine.PinConfig{Mode: machine.PinOutput})
machine.RTL8720D_CHIP_PU.Low()
time.Sleep(100 * time.Millisecond)
machine.RTL8720D_CHIP_PU.High()
time.Sleep(1000 * time.Millisecond)
if debug {
waitSerial()
}
uart = UARTx{
UART: &machine.UART{
Buffer: machine.NewRingBuffer(),
Bus: sam.SERCOM0_USART_INT,
SERCOM: 0,
},
}
uart.Interrupt = interrupt.New(sam.IRQ_SERCOM0_2, handleInterrupt)
uart.Configure(machine.UARTConfig{TX: machine.PB24, RX: machine.PC24, BaudRate: 614400})
rtl := rtl8720dn.New(uart)
rtl.Debug(debug)
_, err := rtl.Rpc_tcpip_adapter_init()
if err != nil {
return nil, err
}
return rtl, nil
}
// Wait for user to open serial console
func waitSerial() {
for !machine.Serial.DTR() {
time.Sleep(100 * time.Millisecond)
}
}
type UARTx struct {
*machine.UART
}
func (u UARTx) Read(p []byte) (n int, err error) {
if u.Buffered() == 0 {
time.Sleep(1 * time.Millisecond)
return 0, nil
}
return u.UART.Read(p)
}
+13 -12
View File
@@ -4,28 +4,31 @@
package main package main
import ( import (
"machine"
"errors" "errors"
"fmt" "fmt"
"runtime" "runtime"
"time" "time"
"tinygo.org/x/drivers/net" "tinygo.org/x/drivers/net"
"tinygo.org/x/drivers/rtl8720dn"
) )
// IP address of the server aka "hub". Replace with your own info. // IP address of the server aka "hub". Replace with your own info.
// You can override the setting with the init() in another source code. // You can override the setting with the init() in another source code.
// func init() { // func init() {
// ssid = "your-ssid" // ssid = "your-ssid"
// password = "your-password" // pass = "your-password"
// ntpHost = "129.6.15.29" // ntpHost = "129.6.15.29"
// debug = true // debug = true
// } // }
var ( var (
ssid string ssid string
password string pass string
ntpHost = "129.6.15.29" ntpHost = "129.6.15.29"
debug = false debug = false
) )
const NTP_PACKET_SIZE = 48 const NTP_PACKET_SIZE = 48
@@ -41,18 +44,16 @@ func main() {
} }
func run() error { func run() error {
rtl, err := setupRTL8720DN() adaptor := rtl8720dn.New(machine.UART3, machine.PB24, machine.PC24, machine.RTL8720D_CHIP_PU)
if err != nil { adaptor.Debug(debug)
return err adaptor.Configure()
}
net.UseDriver(rtl)
err = rtl.ConnectToAccessPoint(ssid, password, 10*time.Second) err := adaptor.ConnectToAccessPoint(ssid, pass, 10*time.Second)
if err != nil { if err != nil {
return err return err
} }
ip, subnet, gateway, err := rtl.GetIP() ip, subnet, gateway, err := adaptor.GetIP()
if err != nil { if err != nil {
return err return err
} }
@@ -1,72 +0,0 @@
//go:build wioterminal
// +build wioterminal
package main
import (
"device/sam"
"machine"
"runtime/interrupt"
"time"
"tinygo.org/x/drivers/rtl8720dn"
)
var (
uart UARTx
)
func handleInterrupt(interrupt.Interrupt) {
// should reset IRQ
uart.Receive(byte((uart.Bus.DATA.Get() & 0xFF)))
uart.Bus.INTFLAG.SetBits(sam.SERCOM_USART_INT_INTFLAG_RXC)
}
func setupRTL8720DN() (*rtl8720dn.RTL8720DN, error) {
machine.RTL8720D_CHIP_PU.Configure(machine.PinConfig{Mode: machine.PinOutput})
machine.RTL8720D_CHIP_PU.Low()
time.Sleep(100 * time.Millisecond)
machine.RTL8720D_CHIP_PU.High()
time.Sleep(1000 * time.Millisecond)
waitSerial()
uart = UARTx{
UART: &machine.UART{
Buffer: machine.NewRingBuffer(),
Bus: sam.SERCOM0_USART_INT,
SERCOM: 0,
},
}
uart.Interrupt = interrupt.New(sam.IRQ_SERCOM0_2, handleInterrupt)
uart.Configure(machine.UARTConfig{TX: machine.PB24, RX: machine.PC24, BaudRate: 614400})
rtl := rtl8720dn.New(uart)
rtl.Debug(debug)
_, err := rtl.Rpc_tcpip_adapter_init()
if err != nil {
return nil, err
}
return rtl, nil
}
// Wait for user to open serial console
func waitSerial() {
for !machine.Serial.DTR() {
time.Sleep(100 * time.Millisecond)
}
}
type UARTx struct {
*machine.UART
}
func (u UARTx) Read(p []byte) (n int, err error) {
if u.Buffered() == 0 {
time.Sleep(1 * time.Millisecond)
return 0, nil
}
return u.UART.Read(p)
}
+11 -11
View File
@@ -4,28 +4,30 @@
// You can open a server to accept connections from this program using: // You can open a server to accept connections from this program using:
// //
// nc -w 5 -lk 8080 // nc -w 5 -lk 8080
//
package main package main
import ( import (
"machine"
"bytes" "bytes"
"fmt" "fmt"
"time" "time"
"tinygo.org/x/drivers/net" "tinygo.org/x/drivers/net"
"tinygo.org/x/drivers/rtl8720dn"
) )
// You can override the setting with the init() in another source code. // You can override the setting with the init() in another source code.
// func init() { // func init() {
// ssid = "sghome-gw" // ssid = "your-ssid"
// password = "3af25537b4524" // pass = "your-password"
// serverIP = "192.168.1.119" // serverIP = "192.168.1.119"
// debug = true // debug = true
// } // }
var ( var (
ssid string ssid string
password string pass string
serverIP = "" serverIP = ""
debug = false debug = false
) )
@@ -41,18 +43,16 @@ func main() {
} }
func run() error { func run() error {
rtl, err := setupRTL8720DN() adaptor := rtl8720dn.New(machine.UART3, machine.PB24, machine.PC24, machine.RTL8720D_CHIP_PU)
if err != nil { adaptor.Debug(debug)
return err adaptor.Configure()
}
net.UseDriver(rtl)
err = rtl.ConnectToAccessPoint(ssid, password, 10*time.Second) err := adaptor.ConnectToAccessPoint(ssid, pass, 10*time.Second)
if err != nil { if err != nil {
return err return err
} }
ip, subnet, gateway, err := rtl.GetIP() ip, subnet, gateway, err := adaptor.GetIP()
if err != nil { if err != nil {
return err return err
} }
@@ -1,72 +0,0 @@
//go:build wioterminal
// +build wioterminal
package main
import (
"device/sam"
"machine"
"runtime/interrupt"
"time"
"tinygo.org/x/drivers/rtl8720dn"
)
var (
uart UARTx
)
func handleInterrupt(interrupt.Interrupt) {
// should reset IRQ
uart.Receive(byte((uart.Bus.DATA.Get() & 0xFF)))
uart.Bus.INTFLAG.SetBits(sam.SERCOM_USART_INT_INTFLAG_RXC)
}
func setupRTL8720DN() (*rtl8720dn.RTL8720DN, error) {
machine.RTL8720D_CHIP_PU.Configure(machine.PinConfig{Mode: machine.PinOutput})
machine.RTL8720D_CHIP_PU.Low()
time.Sleep(100 * time.Millisecond)
machine.RTL8720D_CHIP_PU.High()
time.Sleep(1000 * time.Millisecond)
waitSerial()
uart = UARTx{
UART: &machine.UART{
Buffer: machine.NewRingBuffer(),
Bus: sam.SERCOM0_USART_INT,
SERCOM: 0,
},
}
uart.Interrupt = interrupt.New(sam.IRQ_SERCOM0_2, handleInterrupt)
uart.Configure(machine.UARTConfig{TX: machine.PB24, RX: machine.PC24, BaudRate: 614400})
rtl := rtl8720dn.New(uart)
rtl.Debug(debug)
_, err := rtl.Rpc_tcpip_adapter_init()
if err != nil {
return nil, err
}
return rtl, nil
}
// Wait for user to open serial console
func waitSerial() {
for !machine.Serial.DTR() {
time.Sleep(100 * time.Millisecond)
}
}
type UARTx struct {
*machine.UART
}
func (u UARTx) Read(p []byte) (n int, err error) {
if u.Buffered() == 0 {
time.Sleep(1 * time.Millisecond)
return 0, nil
}
return u.UART.Read(p)
}
+14 -14
View File
@@ -1,6 +1,8 @@
package main package main
import ( import (
"machine"
"bufio" "bufio"
"fmt" "fmt"
"strings" "strings"
@@ -14,17 +16,17 @@ import (
// You can override the setting with the init() in another source code. // You can override the setting with the init() in another source code.
// func init() { // func init() {
// ssid = "your-ssid" // ssid = "your-ssid"
// password = "your-password" // pass = "your-password"
// debug = true // debug = true
// url = "https://www.example.com" // url = "https://www.example.com"
// test_root_ca = "..." // test_root_ca = "..."
// } // }
var ( var (
ssid string ssid string
password string pass string
url string = "https://www.example.com" url string = "https://www.example.com"
debug = false debug = false
) )
// Set the test_root_ca created by the following command // Set the test_root_ca created by the following command
@@ -57,7 +59,6 @@ var buf [0x1000]byte
var lastRequestTime time.Time var lastRequestTime time.Time
var conn net.Conn var conn net.Conn
var adaptor *rtl8720dn.RTL8720DN
func main() { func main() {
err := run() err := run()
@@ -68,20 +69,19 @@ func main() {
} }
func run() error { func run() error {
rtl, err := setupRTL8720DN() adaptor := rtl8720dn.New(machine.UART3, machine.PB24, machine.PC24, machine.RTL8720D_CHIP_PU)
if err != nil { adaptor.Debug(debug)
return err adaptor.Configure()
}
rtl.SetRootCA(&test_root_ca) adaptor.SetRootCA(&test_root_ca)
net.UseDriver(rtl)
http.SetBuf(buf[:]) http.SetBuf(buf[:])
err = rtl.ConnectToAccessPoint(ssid, password, 10*time.Second) err := adaptor.ConnectToAccessPoint(ssid, pass, 10*time.Second)
if err != nil { if err != nil {
return err return err
} }
ip, subnet, gateway, err := rtl.GetIP() ip, subnet, gateway, err := adaptor.GetIP()
if err != nil { if err != nil {
return err return err
} }
@@ -1,72 +0,0 @@
//go:build wioterminal
// +build wioterminal
package main
import (
"device/sam"
"machine"
"runtime/interrupt"
"time"
"tinygo.org/x/drivers/rtl8720dn"
)
var (
uart UARTx
)
func handleInterrupt(interrupt.Interrupt) {
// should reset IRQ
uart.Receive(byte((uart.Bus.DATA.Get() & 0xFF)))
uart.Bus.INTFLAG.SetBits(sam.SERCOM_USART_INT_INTFLAG_RXC)
}
func setupRTL8720DN() (*rtl8720dn.RTL8720DN, error) {
machine.RTL8720D_CHIP_PU.Configure(machine.PinConfig{Mode: machine.PinOutput})
machine.RTL8720D_CHIP_PU.Low()
time.Sleep(100 * time.Millisecond)
machine.RTL8720D_CHIP_PU.High()
time.Sleep(1000 * time.Millisecond)
waitSerial()
uart = UARTx{
UART: &machine.UART{
Buffer: machine.NewRingBuffer(),
Bus: sam.SERCOM0_USART_INT,
SERCOM: 0,
},
}
uart.Interrupt = interrupt.New(sam.IRQ_SERCOM0_2, handleInterrupt)
uart.Configure(machine.UARTConfig{TX: machine.PB24, RX: machine.PC24, BaudRate: 614400})
rtl := rtl8720dn.New(uart)
rtl.Debug(debug)
_, err := rtl.Rpc_tcpip_adapter_init()
if err != nil {
return nil, err
}
return rtl, nil
}
// Wait for user to open serial console
func waitSerial() {
for !machine.Serial.DTR() {
time.Sleep(100 * time.Millisecond)
}
}
type UARTx struct {
*machine.UART
}
func (u UARTx) Read(p []byte) (n int, err error) {
if u.Buffered() == 0 {
time.Sleep(1 * time.Millisecond)
return 0, nil
}
return u.UART.Read(p)
}
+14 -12
View File
@@ -1,28 +1,31 @@
package main package main
import ( import (
"machine"
"fmt" "fmt"
"strconv" "strconv"
"time" "time"
"tinygo.org/x/drivers/net" "tinygo.org/x/drivers/net"
"tinygo.org/x/drivers/net/http" "tinygo.org/x/drivers/net/http"
"tinygo.org/x/drivers/rtl8720dn"
) )
// IP address of the server aka "hub". Replace with your own info. // IP address of the server aka "hub". Replace with your own info.
// You can override the setting with the init() in another source code. // You can override the setting with the init() in another source code.
// func init() { // func init() {
// ssid = "your-ssid" // ssid = "your-ssid"
// password = "your-password" // pass = "your-password"
// hubIP = "192.168.1.118" // hubIP = "192.168.1.118"
// debug = true // debug = true
// } // }
var ( var (
ssid string ssid string
password string pass string
hubIP = "" hubIP = ""
debug = false debug = false
) )
var buf [0x400]byte var buf [0x400]byte
@@ -36,19 +39,18 @@ func main() {
} }
func run() error { func run() error {
rtl, err := setupRTL8720DN() adaptor := rtl8720dn.New(machine.UART3, machine.PB24, machine.PC24, machine.RTL8720D_CHIP_PU)
if err != nil { adaptor.Debug(debug)
return err adaptor.Configure()
}
net.UseDriver(rtl)
http.SetBuf(buf[:]) http.SetBuf(buf[:])
err = rtl.ConnectToAccessPoint(ssid, password, 10*time.Second) err := adaptor.ConnectToAccessPoint(ssid, pass, 10*time.Second)
if err != nil { if err != nil {
return err return err
} }
ip, subnet, gateway, err := rtl.GetIP() ip, subnet, gateway, err := adaptor.GetIP()
if err != nil { if err != nil {
return err return err
} }
@@ -1,72 +0,0 @@
//go:build wioterminal
// +build wioterminal
package main
import (
"device/sam"
"machine"
"runtime/interrupt"
"time"
"tinygo.org/x/drivers/rtl8720dn"
)
var (
uart UARTx
)
func handleInterrupt(interrupt.Interrupt) {
// should reset IRQ
uart.Receive(byte((uart.Bus.DATA.Get() & 0xFF)))
uart.Bus.INTFLAG.SetBits(sam.SERCOM_USART_INT_INTFLAG_RXC)
}
func setupRTL8720DN() (*rtl8720dn.RTL8720DN, error) {
machine.RTL8720D_CHIP_PU.Configure(machine.PinConfig{Mode: machine.PinOutput})
machine.RTL8720D_CHIP_PU.Low()
time.Sleep(100 * time.Millisecond)
machine.RTL8720D_CHIP_PU.High()
time.Sleep(1000 * time.Millisecond)
waitSerial()
uart = UARTx{
UART: &machine.UART{
Buffer: machine.NewRingBuffer(),
Bus: sam.SERCOM0_USART_INT,
SERCOM: 0,
},
}
uart.Interrupt = interrupt.New(sam.IRQ_SERCOM0_2, handleInterrupt)
uart.Configure(machine.UARTConfig{TX: machine.PB24, RX: machine.PC24, BaudRate: 614400})
rtl := rtl8720dn.New(uart)
rtl.Debug(debug)
_, err := rtl.Rpc_tcpip_adapter_init()
if err != nil {
return nil, err
}
return rtl, nil
}
// Wait for user to open serial console
func waitSerial() {
for !machine.Serial.DTR() {
time.Sleep(100 * time.Millisecond)
}
}
type UARTx struct {
*machine.UART
}
func (u UARTx) Read(p []byte) (n int, err error) {
if u.Buffered() == 0 {
time.Sleep(1 * time.Millisecond)
return 0, nil
}
return u.UART.Read(p)
}
+40
View File
@@ -0,0 +1,40 @@
package main
import (
"machine"
"fmt"
"time"
"tinygo.org/x/drivers/rtl8720dn"
)
var (
debug = false
)
func main() {
err := run()
for err != nil {
fmt.Printf("error: %s\r\n", err.Error())
time.Sleep(5 * time.Second)
}
}
func run() error {
adaptor := rtl8720dn.New(machine.UART3, machine.PB24, machine.PC24, machine.RTL8720D_CHIP_PU)
adaptor.Debug(debug)
adaptor.Configure()
ver, err := adaptor.Version()
if err != nil {
return nil
}
for {
fmt.Printf("RTL8270DN Firmware Version: %s\r\n", ver)
time.Sleep(10 * time.Second)
}
return nil
}
+39 -13
View File
@@ -1,14 +1,18 @@
package main package main
import ( import (
"machine"
"bufio" "bufio"
"fmt" "fmt"
"image/color" "image/color"
"strings" "strings"
"time" "time"
"tinygo.org/x/drivers/net" "tinygo.org/x/drivers/ili9341"
"tinygo.org/x/drivers/net/http" "tinygo.org/x/drivers/net/http"
"tinygo.org/x/drivers/rtl8720dn"
"tinygo.org/x/tinyfont/proggy" "tinygo.org/x/tinyfont/proggy"
"tinygo.org/x/tinyterm" "tinygo.org/x/tinyterm"
) )
@@ -17,19 +21,28 @@ import (
// If debug is enabled, a serial connection is required. // If debug is enabled, a serial connection is required.
// func init() { // func init() {
// ssid = "your-ssid" // ssid = "your-ssid"
// password = "your-password" // pass = "your-password"
// debug = false // true // debug = false // true
// server = "tinygo.org" // server = "tinygo.org"
// } // }
var ( var (
ssid string ssid string
password string pass string
url = "http://tinygo.org/" url = "http://tinygo.org/"
debug = false debug = false
) )
var ( var (
display = ili9341.NewSPI(
machine.SPI3,
machine.LCD_DC,
machine.LCD_SS_PIN,
machine.LCD_RESET,
)
backlight = machine.LCD_BACKLIGHT
terminal = tinyterm.NewTerminal(display) terminal = tinyterm.NewTerminal(display)
black = color.RGBA{0, 0, 0, 255} black = color.RGBA{0, 0, 0, 255}
@@ -66,21 +79,22 @@ func run() error {
fmt.Fprintf(terminal, "Running in debug mode.\r\n") fmt.Fprintf(terminal, "Running in debug mode.\r\n")
fmt.Fprintf(terminal, "A serial connection is required to continue execution.\r\n") fmt.Fprintf(terminal, "A serial connection is required to continue execution.\r\n")
} }
rtl, err := setupRTL8720DN()
if err != nil { adaptor := rtl8720dn.New(machine.UART3, machine.PB24, machine.PC24, machine.RTL8720D_CHIP_PU)
return err adaptor.Debug(debug)
} adaptor.Configure()
net.UseDriver(rtl)
http.UseDriver(adaptor)
http.SetBuf(buf[:]) http.SetBuf(buf[:])
fmt.Fprintf(terminal, "ConnectToAP()\r\n") fmt.Fprintf(terminal, "ConnectToAP()\r\n")
err = rtl.ConnectToAccessPoint(ssid, password, 10*time.Second) err := adaptor.ConnectToAccessPoint(ssid, pass, 10*time.Second)
if err != nil { if err != nil {
return err return err
} }
fmt.Fprintf(terminal, "connected\r\n\r\n") fmt.Fprintf(terminal, "connected\r\n\r\n")
ip, subnet, gateway, err := rtl.GetIP() ip, subnet, gateway, err := adaptor.GetIP()
if err != nil { if err != nil {
return err return err
} }
@@ -134,3 +148,15 @@ func run() error {
time.Sleep(10 * time.Second) time.Sleep(10 * time.Second)
} }
} }
func init() {
machine.SPI3.Configure(machine.SPIConfig{
SCK: machine.LCD_SCK_PIN,
SDO: machine.LCD_SDO_PIN,
SDI: machine.LCD_SDI_PIN,
Frequency: 40000000,
})
display.Configure(ili9341.Config{})
backlight.Configure(machine.PinConfig{machine.PinOutput})
}
@@ -1,98 +0,0 @@
//go:build wioterminal
// +build wioterminal
package main
import (
"device/sam"
"machine"
"runtime/interrupt"
"time"
"tinygo.org/x/drivers/ili9341"
"tinygo.org/x/drivers/rtl8720dn"
)
var (
uart UARTx
)
var (
display = ili9341.NewSPI(
machine.SPI3,
machine.LCD_DC,
machine.LCD_SS_PIN,
machine.LCD_RESET,
)
backlight = machine.LCD_BACKLIGHT
)
func init() {
machine.SPI3.Configure(machine.SPIConfig{
SCK: machine.LCD_SCK_PIN,
SDO: machine.LCD_SDO_PIN,
SDI: machine.LCD_SDI_PIN,
Frequency: 40000000,
})
display.Configure(ili9341.Config{})
backlight.Configure(machine.PinConfig{machine.PinOutput})
}
func handleInterrupt(interrupt.Interrupt) {
// should reset IRQ
uart.Receive(byte((uart.Bus.DATA.Get() & 0xFF)))
uart.Bus.INTFLAG.SetBits(sam.SERCOM_USART_INT_INTFLAG_RXC)
}
func setupRTL8720DN() (*rtl8720dn.RTL8720DN, error) {
machine.RTL8720D_CHIP_PU.Configure(machine.PinConfig{Mode: machine.PinOutput})
machine.RTL8720D_CHIP_PU.Low()
time.Sleep(100 * time.Millisecond)
machine.RTL8720D_CHIP_PU.High()
time.Sleep(1000 * time.Millisecond)
if debug {
waitSerial()
}
uart = UARTx{
UART: &machine.UART{
Buffer: machine.NewRingBuffer(),
Bus: sam.SERCOM0_USART_INT,
SERCOM: 0,
},
}
uart.Interrupt = interrupt.New(sam.IRQ_SERCOM0_2, handleInterrupt)
uart.Configure(machine.UARTConfig{TX: machine.PB24, RX: machine.PC24, BaudRate: 614400})
rtl := rtl8720dn.New(uart)
rtl.Debug(debug)
_, err := rtl.Rpc_tcpip_adapter_init()
if err != nil {
return nil, err
}
return rtl, nil
}
// Wait for user to open serial console
func waitSerial() {
for !machine.Serial.DTR() {
time.Sleep(100 * time.Millisecond)
}
}
type UARTx struct {
*machine.UART
}
func (u UARTx) Read(p []byte) (n int, err error) {
if u.Buffered() == 0 {
time.Sleep(1 * time.Millisecond)
return 0, nil
}
return u.UART.Read(p)
}
+15 -13
View File
@@ -1,28 +1,30 @@
package main package main
import ( import (
"machine"
"bufio" "bufio"
"fmt" "fmt"
"strings" "strings"
"time" "time"
"tinygo.org/x/drivers/net"
"tinygo.org/x/drivers/net/http" "tinygo.org/x/drivers/net/http"
"tinygo.org/x/drivers/rtl8720dn"
) )
// You can override the setting with the init() in another source code. // You can override the setting with the init() in another source code.
// func init() { // func init() {
// ssid = "your-ssid" // ssid = "your-ssid"
// password = "your-password" // pass = "your-password"
// url = "http://tinygo.org/" // url = "http://tinygo.org/"
// debug = true // debug = true
// } // }
var ( var (
ssid string ssid string
password string pass string
url = "http://tinygo.org/" url = "http://tinygo.org/"
debug = false debug = false
) )
var buf [0x400]byte var buf [0x400]byte
@@ -36,19 +38,19 @@ func main() {
} }
func run() error { func run() error {
rtl, err := setupRTL8720DN() adaptor := rtl8720dn.New(machine.UART3, machine.PB24, machine.PC24, machine.RTL8720D_CHIP_PU)
if err != nil { adaptor.Debug(debug)
return err adaptor.Configure()
}
net.UseDriver(rtl) http.UseDriver(adaptor)
http.SetBuf(buf[:]) http.SetBuf(buf[:])
err = rtl.ConnectToAccessPoint(ssid, password, 10*time.Second) err := adaptor.ConnectToAccessPoint(ssid, pass, 10*time.Second)
if err != nil { if err != nil {
return err return err
} }
ip, subnet, gateway, err := rtl.GetIP() ip, subnet, gateway, err := adaptor.GetIP()
if err != nil { if err != nil {
return err return err
} }
@@ -1,72 +0,0 @@
//go:build wioterminal
// +build wioterminal
package main
import (
"device/sam"
"machine"
"runtime/interrupt"
"time"
"tinygo.org/x/drivers/rtl8720dn"
)
var (
uart UARTx
)
func handleInterrupt(interrupt.Interrupt) {
// should reset IRQ
uart.Receive(byte((uart.Bus.DATA.Get() & 0xFF)))
uart.Bus.INTFLAG.SetBits(sam.SERCOM_USART_INT_INTFLAG_RXC)
}
func setupRTL8720DN() (*rtl8720dn.RTL8720DN, error) {
machine.RTL8720D_CHIP_PU.Configure(machine.PinConfig{Mode: machine.PinOutput})
machine.RTL8720D_CHIP_PU.Low()
time.Sleep(100 * time.Millisecond)
machine.RTL8720D_CHIP_PU.High()
time.Sleep(1000 * time.Millisecond)
waitSerial()
uart = UARTx{
UART: &machine.UART{
Buffer: machine.NewRingBuffer(),
Bus: sam.SERCOM0_USART_INT,
SERCOM: 0,
},
}
uart.Interrupt = interrupt.New(sam.IRQ_SERCOM0_2, handleInterrupt)
uart.Configure(machine.UARTConfig{TX: machine.PB24, RX: machine.PC24, BaudRate: 614400})
rtl := rtl8720dn.New(uart)
rtl.Debug(debug)
_, err := rtl.Rpc_tcpip_adapter_init()
if err != nil {
return nil, err
}
return rtl, nil
}
// Wait for user to open serial console
func waitSerial() {
for !machine.Serial.DTR() {
time.Sleep(100 * time.Millisecond)
}
}
type UARTx struct {
*machine.UART
}
func (u UARTx) Read(p []byte) (n int, err error) {
if u.Buffered() == 0 {
time.Sleep(1 * time.Millisecond)
return 0, nil
}
return u.UART.Read(p)
}
+12 -11
View File
@@ -7,19 +7,20 @@ import (
"time" "time"
"tinygo.org/x/drivers/net/http" "tinygo.org/x/drivers/net/http"
"tinygo.org/x/drivers/rtl8720dn"
) )
// You can override the setting with the init() in another source code. // You can override the setting with the init() in another source code.
// func init() { // func init() {
// ssid = "your-ssid" // ssid = "your-ssid"
// password = "your-password" // pass = "your-password"
// debug = true // debug = true
// } // }
var ( var (
ssid string ssid string
password string pass string
debug = false debug = false
) )
var led = machine.LED var led = machine.LED
@@ -37,18 +38,18 @@ func main() {
} }
func run() error { func run() error {
rtl, err := setupRTL8720DN() adaptor := rtl8720dn.New(machine.UART3, machine.PB24, machine.PC24, machine.RTL8720D_CHIP_PU)
if err != nil { adaptor.Debug(debug)
return err adaptor.Configure()
}
http.UseDriver(rtl)
err = rtl.ConnectToAccessPoint(ssid, password, 10*time.Second) http.UseDriver(adaptor)
err := adaptor.ConnectToAccessPoint(ssid, pass, 10*time.Second)
if err != nil { if err != nil {
return err return err
} }
ip, subnet, gateway, err := rtl.GetIP() ip, subnet, gateway, err := adaptor.GetIP()
if err != nil { if err != nil {
return err return err
} }
@@ -1,74 +0,0 @@
//go:build wioterminal
// +build wioterminal
package main
import (
"device/sam"
"machine"
"runtime/interrupt"
"time"
"tinygo.org/x/drivers/rtl8720dn"
)
var (
uart UARTx
)
func handleInterrupt(interrupt.Interrupt) {
// should reset IRQ
uart.Receive(byte((uart.Bus.DATA.Get() & 0xFF)))
uart.Bus.INTFLAG.SetBits(sam.SERCOM_USART_INT_INTFLAG_RXC)
}
func setupRTL8720DN() (*rtl8720dn.RTL8720DN, error) {
machine.RTL8720D_CHIP_PU.Configure(machine.PinConfig{Mode: machine.PinOutput})
machine.RTL8720D_CHIP_PU.Low()
time.Sleep(100 * time.Millisecond)
machine.RTL8720D_CHIP_PU.High()
time.Sleep(1000 * time.Millisecond)
if debug {
waitSerial()
}
uart = UARTx{
UART: &machine.UART{
Buffer: machine.NewRingBuffer(),
Bus: sam.SERCOM0_USART_INT,
SERCOM: 0,
},
}
uart.Interrupt = interrupt.New(sam.IRQ_SERCOM0_2, handleInterrupt)
uart.Configure(machine.UARTConfig{TX: machine.PB24, RX: machine.PC24, BaudRate: 614400})
rtl := rtl8720dn.New(uart)
rtl.Debug(debug)
_, err := rtl.Rpc_tcpip_adapter_init()
if err != nil {
return nil, err
}
return rtl, nil
}
// Wait for user to open serial console
func waitSerial() {
for !machine.Serial.DTR() {
time.Sleep(100 * time.Millisecond)
}
}
type UARTx struct {
*machine.UART
}
func (u UARTx) Read(p []byte) (n int, err error) {
if u.Buffered() == 0 {
time.Sleep(1 * time.Millisecond)
return 0, nil
}
return u.UART.Read(p)
}
+39
View File
@@ -0,0 +1,39 @@
package main
import (
"machine"
"time"
"tinygo.org/x/drivers/scd4x"
)
var (
i2c = machine.I2C0
sensor = scd4x.New(i2c)
)
func main() {
time.Sleep(1500 * time.Millisecond)
i2c.Configure(machine.I2CConfig{})
if err := sensor.Configure(); err != nil {
println(err)
}
time.Sleep(1500 * time.Millisecond)
if err := sensor.StartPeriodicMeasurement(); err != nil {
println(err)
}
time.Sleep(1500 * time.Millisecond)
for {
co2, err := sensor.ReadCO2()
if err != nil {
println(err)
}
println("CO2", co2)
time.Sleep(time.Second)
}
}
+1 -1
View File
@@ -8,7 +8,7 @@ import (
) )
func init() { func init() {
spi = machine.SPI0 spi = &machine.SPI0
sckPin = machine.SPI0_SCK_PIN sckPin = machine.SPI0_SCK_PIN
sdoPin = machine.SPI0_SDO_PIN sdoPin = machine.SPI0_SDO_PIN
sdiPin = machine.SPI0_SDI_PIN sdiPin = machine.SPI0_SDI_PIN
+1 -1
View File
@@ -8,7 +8,7 @@ import (
) )
func init() { func init() {
spi = machine.SPI1 spi = &machine.SPI1
sckPin = machine.SDCARD_SCK_PIN sckPin = machine.SDCARD_SCK_PIN
sdoPin = machine.SDCARD_SDO_PIN sdoPin = machine.SDCARD_SDO_PIN
sdiPin = machine.SDCARD_SDI_PIN sdiPin = machine.SDCARD_SDI_PIN
+1 -1
View File
@@ -8,7 +8,7 @@ import (
) )
func init() { func init() {
spi = machine.SPI0 spi = &machine.SPI0
sckPin = machine.SPI0_SCK_PIN sckPin = machine.SPI0_SCK_PIN
sdoPin = machine.SPI0_SDO_PIN sdoPin = machine.SPI0_SDO_PIN
sdiPin = machine.SPI0_SDI_PIN sdiPin = machine.SPI0_SDI_PIN
+1 -9
View File
@@ -9,7 +9,7 @@ import (
) )
var ( var (
spi machine.SPI spi *machine.SPI
sckPin machine.Pin sckPin machine.Pin
sdoPin machine.Pin sdoPin machine.Pin
sdiPin machine.Pin sdiPin machine.Pin
@@ -18,7 +18,6 @@ var (
) )
func main() { func main() {
waitSerial()
fmt.Printf("sdcard console\r\n") fmt.Printf("sdcard console\r\n")
led := ledPin led := ledPin
@@ -42,10 +41,3 @@ func main() {
time.Sleep(200 * time.Millisecond) time.Sleep(200 * time.Millisecond)
} }
} }
// Wait for user to open serial console
func waitSerial() {
for !machine.Serial.DTR() {
time.Sleep(100 * time.Millisecond)
}
}
+1 -1
View File
@@ -8,7 +8,7 @@ import (
) )
func init() { func init() {
spi = machine.SDCARD_SPI spi = &machine.SDCARD_SPI
sckPin = machine.SDCARD_SCK_PIN sckPin = machine.SDCARD_SCK_PIN
sdoPin = machine.SDCARD_SDO_PIN sdoPin = machine.SDCARD_SDO_PIN
sdiPin = machine.SDCARD_SDI_PIN sdiPin = machine.SDCARD_SDI_PIN
+1 -1
View File
@@ -8,7 +8,7 @@ import (
) )
func init() { func init() {
spi = machine.SPI0 spi = &machine.SPI0
sckPin = machine.SPI0_SCK_PIN sckPin = machine.SPI0_SCK_PIN
sdoPin = machine.SPI0_SDO_PIN sdoPin = machine.SPI0_SDO_PIN
sdiPin = machine.SPI0_SDI_PIN sdiPin = machine.SPI0_SDI_PIN
+1 -1
View File
@@ -8,7 +8,7 @@ import (
) )
func init() { func init() {
spi = machine.SPI0 spi = &machine.SPI0
sckPin = machine.SPI0_SCK_PIN sckPin = machine.SPI0_SCK_PIN
sdoPin = machine.SPI0_SDO_PIN sdoPin = machine.SPI0_SDO_PIN
sdiPin = machine.SPI0_SDI_PIN sdiPin = machine.SPI0_SDI_PIN
@@ -0,0 +1,18 @@
//go:build thingplus_rp2040
// +build thingplus_rp2040
package main
import (
"machine"
)
func init() {
spi = machine.SPI1
sckPin = machine.SPI1_SCK_PIN
sdoPin = machine.SPI1_SDO_PIN
sdiPin = machine.SPI1_SDI_PIN
csPin = machine.GPIO9
ledPin = machine.LED
}
+1 -1
View File
@@ -8,7 +8,7 @@ import (
) )
func init() { func init() {
spi = machine.SPI2 spi = &machine.SPI2
sckPin = machine.SCK2 sckPin = machine.SCK2
sdoPin = machine.SDO2 sdoPin = machine.SDO2
sdiPin = machine.SDI2 sdiPin = machine.SDI2
+1 -1
View File
@@ -8,7 +8,7 @@ import (
) )
func init() { func init() {
spi = machine.SPI0 spi = &machine.SPI0
sckPin = machine.SPI0_SCK_PIN sckPin = machine.SPI0_SCK_PIN
sdoPin = machine.SPI0_SDO_PIN sdoPin = machine.SPI0_SDO_PIN
sdiPin = machine.SPI0_SDI_PIN sdiPin = machine.SPI0_SDI_PIN
+1 -1
View File
@@ -8,7 +8,7 @@ import (
) )
func init() { func init() {
spi = machine.SPI1 spi = &machine.SPI1
sckPin = machine.SDCARD_SCK_PIN sckPin = machine.SDCARD_SCK_PIN
sdoPin = machine.SDCARD_SDO_PIN sdoPin = machine.SDCARD_SDO_PIN
sdiPin = machine.SDCARD_SDI_PIN sdiPin = machine.SDCARD_SDI_PIN
+1 -1
View File
@@ -8,7 +8,7 @@ import (
) )
func init() { func init() {
spi = machine.SPI0 spi = &machine.SPI0
sckPin = machine.SPI0_SCK_PIN sckPin = machine.SPI0_SCK_PIN
sdoPin = machine.SPI0_SDO_PIN sdoPin = machine.SPI0_SDO_PIN
sdiPin = machine.SPI0_SDI_PIN sdiPin = machine.SPI0_SDI_PIN
+1 -10
View File
@@ -11,7 +11,7 @@ import (
) )
var ( var (
spi machine.SPI spi *machine.SPI
sckPin machine.Pin sckPin machine.Pin
sdoPin machine.Pin sdoPin machine.Pin
sdiPin machine.Pin sdiPin machine.Pin
@@ -20,8 +20,6 @@ var (
) )
func main() { func main() {
waitSerial()
sd := sdcard.New(spi, sckPin, sdoPin, sdiPin, csPin) sd := sdcard.New(spi, sckPin, sdoPin, sdiPin, csPin)
err := sd.Configure() err := sd.Configure()
if err != nil { if err != nil {
@@ -40,10 +38,3 @@ func main() {
console.RunFor(&sd, filesystem) console.RunFor(&sd, filesystem)
} }
// Wait for user to open serial console
func waitSerial() {
for !machine.Serial.DTR() {
time.Sleep(100 * time.Millisecond)
}
}
+1 -1
View File
@@ -8,7 +8,7 @@ import (
) )
func init() { func init() {
spi = machine.SDCARD_SPI spi = &machine.SDCARD_SPI
sckPin = machine.SDCARD_SCK_PIN sckPin = machine.SDCARD_SCK_PIN
sdoPin = machine.SDCARD_SDO_PIN sdoPin = machine.SDCARD_SDO_PIN
sdiPin = machine.SDCARD_SDI_PIN sdiPin = machine.SDCARD_SDI_PIN
+1 -1
View File
@@ -8,7 +8,7 @@ import (
) )
func init() { func init() {
spi = machine.SPI0 spi = &machine.SPI0
sckPin = machine.SPI0_SCK_PIN sckPin = machine.SPI0_SCK_PIN
sdoPin = machine.SPI0_SDO_PIN sdoPin = machine.SPI0_SDO_PIN
sdiPin = machine.SPI0_SDI_PIN sdiPin = machine.SPI0_SDI_PIN
+1 -1
View File
@@ -8,7 +8,7 @@ import (
) )
func init() { func init() {
spi = machine.SPI0 spi = &machine.SPI0
sckPin = machine.SPI0_SCK_PIN sckPin = machine.SPI0_SCK_PIN
sdoPin = machine.SPI0_SDO_PIN sdoPin = machine.SPI0_SDO_PIN
sdiPin = machine.SPI0_SDI_PIN sdiPin = machine.SPI0_SDI_PIN
@@ -0,0 +1,18 @@
//go:build thingplus_rp2040
// +build thingplus_rp2040
package main
import (
"machine"
)
func init() {
spi = machine.SPI1
sckPin = machine.SPI1_SCK_PIN
sdoPin = machine.SPI1_SDO_PIN
sdiPin = machine.SPI1_SDI_PIN
csPin = machine.GPIO9
ledPin = machine.LED
}
+1 -1
View File
@@ -8,7 +8,7 @@ import (
) )
func init() { func init() {
spi = machine.SPI2 spi = &machine.SPI2
sckPin = machine.SCK2 sckPin = machine.SCK2
sdoPin = machine.SDO2 sdoPin = machine.SDO2
sdiPin = machine.SDI2 sdiPin = machine.SDI2
+68
View File
@@ -0,0 +1,68 @@
package main
import (
"image/color"
"machine"
"math/rand"
"tinygo.org/x/drivers/ssd1289"
)
func main() {
//The SSD1289 is configured in 16 bit parallel mode and requires 16 GPIOs
//The Pin bus is the most flexible but ineffecient method it switches
//individual pins on and off. If you are able to use consecutive pins
//consider creating a more efficient bus implementation that uses
//your microcontrollers built in "ports"
//see rp2040bus.go for an example for the rapsberry pi pico
bus := ssd1289.NewPinBus([16]machine.Pin{
machine.GP4, //DB0
machine.GP5, //DB1
machine.GP6, //DB2
machine.GP7, //DB3
machine.GP8, //DB4
machine.GP9, //DB5
machine.GP10, //DB6
machine.GP11, //DB7
machine.GP12, //DB8
machine.GP13, //DB9
machine.GP14, //DB10
machine.GP15, //DB11
machine.GP16, //DB12
machine.GP17, //DB13
machine.GP18, //DB14
machine.GP19, //DB15
})
//Control pins for the SSD1289
rs := machine.GP0
wr := machine.GP1
cs := machine.GP2
rst := machine.GP3
display := ssd1289.New(rs, wr, cs, rst, bus)
display.Configure() //Sends intialization sequence to SSD1289.
//!! After configure the display will contain random data and needs to be cleared
background := color.RGBA{0, 0, 0, 255} //Black
display.FillDisplay(background) //Clears the display to the given color
for {
//Draw random filled coloured rectangles
x := int16(rand.Intn(120))
w := int16(rand.Intn(120))
y := int16(rand.Intn(160))
h := int16(rand.Intn(160))
r := uint8(rand.Intn(255))
g := uint8(rand.Intn(255))
b := uint8(rand.Intn(255))
c := color.RGBA{r, g, b, 255}
display.FillRect(x, y, w, h, c) //Fills the given rectangle the rest of the display is unaffected.
}
}
+6 -6
View File
@@ -2,13 +2,13 @@
// +build gnse // +build gnse
/* /*
Generic Node Sensor Edition Generic Node Sensor Edition
RFSwitch RFSwitch
Disable Switch : PB8=OFF PA0=OFF PA1=OFF Disable Switch : PB8=OFF PA0=OFF PA1=OFF
Enable RX : PB8=ON PA0=ON PA1=OFF Enable RX : PB8=ON PA0=ON PA1=OFF
Enable TX RFO LP : PB8=ON PA0=ON PA1=ON Enable TX RFO LP : PB8=ON PA0=ON PA1=ON
Enable TX RFO HP : PB8=ON PA0=OFF PA1=ON Enable TX RFO HP : PB8=ON PA0=OFF PA1=ON
*/ */
package rfswitch package rfswitch
+2 -2
View File
@@ -2,8 +2,8 @@
// +build nucleowl55jc // +build nucleowl55jc
/* /*
Nucleo WL55JC1 Nucleo WL55JC1
RFSwitch RFSwitch
+-----------+---------+------------+------------+ +-----------+---------+------------+------------+
| | FE_CTRL1 | FE_CTRL2 | FE_CTRL3 | | | FE_CTRL1 | FE_CTRL2 | FE_CTRL3 |
+49
View File
@@ -0,0 +1,49 @@
package main
import (
"image/color"
"machine"
"tinygo.org/x/drivers/uc8151"
)
var display uc8151.Device
var led machine.Pin
func main() {
led = machine.LED
led.Configure(machine.PinConfig{Mode: machine.PinOutput})
machine.SPI0.Configure(machine.SPIConfig{
Frequency: 12000000,
SCK: machine.EPD_SCK_PIN,
SDO: machine.EPD_SDO_PIN,
})
display = uc8151.New(machine.SPI0, machine.EPD_CS_PIN, machine.EPD_DC_PIN, machine.EPD_RESET_PIN, machine.EPD_BUSY_PIN)
display.Configure(uc8151.Config{
Rotation: uc8151.ROTATION_270,
Speed: uc8151.MEDIUM,
Blocking: true,
})
black := color.RGBA{1, 1, 1, 255}
display.ClearBuffer()
display.Display()
for i := int16(0); i < 37; i++ {
for j := int16(0); j < 16; j++ {
if (i+j)%2 == 0 {
showRect(i*8, j*8, 8, 8, black)
}
}
}
display.Display()
}
func showRect(x int16, y int16, w int16, h int16, c color.RGBA) {
for i := x; i < x+w; i++ {
for j := y; j < y+h; j++ {
display.SetPixel(i, j, c)
}
}
}
+34
View File
@@ -0,0 +1,34 @@
package main
import (
"machine"
"tinygo.org/x/drivers/vl6180x"
"time"
)
func main() {
time.Sleep(3 * time.Second)
machine.I2C0.Configure(machine.I2CConfig{
Frequency: 400000,
})
sensor := vl6180x.New(machine.I2C0)
connected := sensor.Connected()
if !connected {
println("VL6180X device not found")
return
}
println("VL6180X device found")
sensor.Configure(true)
var value uint16
var status uint8
for {
value = sensor.Read()
status = sensor.ReadStatus()
println("Distance (mm):", value)
println("Status:", status)
println("---")
time.Sleep(100 * time.Millisecond)
}
}
+84
View File
@@ -0,0 +1,84 @@
package main
import (
"machine"
"image/color"
"time"
"tinygo.org/x/drivers/waveshare-epd/epd2in9"
)
var display epd2in9.Device
const (
width = 128
height = 296
)
func main() {
machine.SPI0.Configure(machine.SPIConfig{
Frequency: 8000000,
Mode: 0,
})
display = epd2in9.New(machine.SPI0, machine.GPIO2, machine.GPIO3, machine.GPIO4, machine.GPIO5)
display.Configure(epd2in9.Config{
Width: width,
LogicalWidth: width,
Height: height,
})
black := color.RGBA{1, 1, 1, 255}
white := color.RGBA{0, 0, 0, 255}
display.ClearBuffer()
println("Clear the display")
display.ClearDisplay()
display.WaitUntilIdle()
println("Waiting for 2 seconds")
time.Sleep(2 * time.Second)
// Show a checkered board
for i := int16(0); i < width/8; i++ {
for j := int16(0); j < height/8; j++ {
if (i+j)%2 == 0 {
showRect(i*8, j*8, 8, 8, black)
}
}
}
println("Show checkered board")
display.Display()
display.WaitUntilIdle()
println("Waiting for 2 seconds")
time.Sleep(2 * time.Second)
println("Set partial lut")
display.SetLUT(false) // partial updates (faster, but with some ghosting)
println("Show smaller striped area")
for i := int16(40); i < 88; i++ {
for j := int16(83); j < 166; j++ {
if (i+j)%4 == 0 || (i+j)%4 == 1 {
display.SetPixel(i, j, black)
} else {
display.SetPixel(i, j, white)
}
}
}
display.Display()
display.WaitUntilIdle()
display.DeepSleep()
println("You could remove power now")
}
func showRect(x int16, y int16, w int16, h int16, c color.RGBA) {
for i := x; i < x+w; i++ {
for j := y; j < y+h; j++ {
display.SetPixel(i, j, c)
}
}
}
+5 -4
View File
@@ -4,7 +4,6 @@
// You can open a server to accept connections from this program using: // You can open a server to accept connections from this program using:
// //
// nc -w 5 -lk 8080 // nc -w 5 -lk 8080
//
package main package main
import ( import (
@@ -15,9 +14,11 @@ import (
"tinygo.org/x/drivers/net" "tinygo.org/x/drivers/net"
) )
// access point info var (
const ssid = "" // access point info
const pass = "" ssid string
pass string
)
// IP address of the server aka "hub". Replace with your own info. // IP address of the server aka "hub". Replace with your own info.
const serverIP = "" const serverIP = ""
+5 -3
View File
@@ -9,9 +9,11 @@ import (
"tinygo.org/x/drivers/wifinina" "tinygo.org/x/drivers/wifinina"
) )
// access point info var (
const ssid = "" // access point info
const pass = "" ssid string
pass string
)
// these are the default pins for the Arduino Nano33 IoT. // these are the default pins for the Arduino Nano33 IoT.
// change these to connect to a different UART or pins for the ESP8266/ESP32 // change these to connect to a different UART or pins for the ESP8266/ESP32
+5 -4
View File
@@ -9,7 +9,6 @@
// //
// examples/wifinina/webclient // examples/wifinina/webclient
// examples/wifinina/tlsclient // examples/wifinina/tlsclient
//
package main package main
import ( import (
@@ -24,9 +23,11 @@ import (
"tinygo.org/x/drivers/wifinina" "tinygo.org/x/drivers/wifinina"
) )
// access point info var (
const ssid = "" // access point info
const pass = "" ssid string
pass string
)
// IP address of the server aka "hub". Replace with your own info. // IP address of the server aka "hub". Replace with your own info.
// Can specify a URL starting with http or https // Can specify a URL starting with http or https
+6 -5
View File
@@ -7,8 +7,7 @@
// //
// You must install the Paho MQTT package to build this program: // You must install the Paho MQTT package to build this program:
// //
// go get -u github.com/eclipse/paho.mqtt.golang // go get -u github.com/eclipse/paho.mqtt.golang
//
package main package main
import ( import (
@@ -21,9 +20,11 @@ import (
"tinygo.org/x/drivers/wifinina" "tinygo.org/x/drivers/wifinina"
) )
// access point info var (
const ssid = "" // access point info
const pass = "" ssid string
pass string
)
// IP address of the MQTT broker to use. Replace with your own info. // IP address of the MQTT broker to use. Replace with your own info.
const server = "tcp://test.mosquitto.org:1883" const server = "tcp://test.mosquitto.org:1883"
+6 -5
View File
@@ -7,8 +7,7 @@
// //
// You must also install the Paho MQTT package to build this program: // You must also install the Paho MQTT package to build this program:
// //
// go get -u github.com/eclipse/paho.mqtt.golang // go get -u github.com/eclipse/paho.mqtt.golang
//
package main package main
import ( import (
@@ -21,9 +20,11 @@ import (
"tinygo.org/x/drivers/wifinina" "tinygo.org/x/drivers/wifinina"
) )
// access point info var (
const ssid = "" // access point info
const pass = "" ssid string
pass string
)
// IP address of the MQTT broker to use. Replace with your own info. // IP address of the MQTT broker to use. Replace with your own info.
const server = "tcp://test.mosquitto.org:1883" const server = "tcp://test.mosquitto.org:1883"

Some files were not shown because too many files have changed in this diff Show More