DEV Community

Cover image for ๐Ÿš€ The Untold Power of TinyGo: How to Run Go on Microcontrollers and Supercharge Embedded Development
Yevhen Kozachenko ๐Ÿ‡บ๐Ÿ‡ฆ
Yevhen Kozachenko ๐Ÿ‡บ๐Ÿ‡ฆ

Posted on • Originally published at ekwoster.dev

๐Ÿš€ The Untold Power of TinyGo: How to Run Go on Microcontrollers and Supercharge Embedded Development

๐Ÿš€ The Untold Power of TinyGo: How to Run Go on Microcontrollers and Supercharge Embedded Development

If you thought Go was just for servers and CLI tools, think again. There's a lesser-known side to the Go language that opens the door to the world of microcontrollers and embedded systems โ€” it's called TinyGo, and it's a game-changer.

Imagine writing firmly-typed, garbage-collected, highly performant code for your Arduino or STM32 boardโ€”in Go. Sounds like a dream, but it's entirely possible with TinyGo.

In this post, weโ€™ll go deep into:

  • What TinyGo is and how it works
  • Why it might be better than C or MicroPython for certain embedded projects
  • How to get startedโ€”including code samples
  • Diving into an actual embedded project using TinyGo

Let's get hacking. ๐Ÿ”ง


๐Ÿ” What is TinyGo?

TinyGo is a Go compiler that targets small devices. Itโ€™s essentially a subset of the Go language that compiles to WebAssembly or native code for microcontrollers. Developed and maintained by the open-source community, it makes Go a viable tool for low-level embedded systems where every byte counts.

"The goal of TinyGo is to bring the Go programming language to small devices and modern web browsers by creating a new compiler based on LLVM." โ€” TinyGo Docs

TinyGo supports:

  • AVR-based boards (like Arduino Uno)
  • ARM Cortex-M microcontrollers (STM32, etc.)
  • WebAssembly (Wasm) targets
  • RISC-V and ESP32 (in-progress or partial support)

Read more: https://tinygo.org


๐Ÿ†š Why Not Just Use C or MicroPython?

Feature C MicroPython TinyGo
Static Typing โœ… โŒ โœ…
Garbage Collector โŒ โœ… โœ… (GC-lite)
Tooling Low-level High-level Modern (Go toolchain)
RAM Use Minimal High Optimized
Compile Speed Fast N/A Reasonable

TinyGo fits beautifully in the sweet spot between C's performance and MicroPython's developer friendliness.

  • Better tooling via go build, go test, and gopls
  • Safer than C (no buffer overflows or manual memory management)
  • Compiled binary is smaller than MicroPython for many targets

๐Ÿงฐ Getting Started with TinyGo

๐Ÿ”ง Install TinyGo

You must have Go (v1.20+) installed. Then:

brew tap tinygo-org/tools
brew install tinygo
Enter fullscreen mode Exit fullscreen mode

Or use the installer for your platform: Install Docs

Test the installation:

tinygo version
Enter fullscreen mode Exit fullscreen mode

๐Ÿ–ฅ๏ธ Hello World (for your terminal)

package main

import "fmt"

func main() {
    fmt.Println("Hello from TinyGo!")
}
Enter fullscreen mode Exit fullscreen mode

Now compile to WebAssembly (just for fun):

tinygo build -o hello.wasm -target=wasi main.go
Enter fullscreen mode Exit fullscreen mode

๐Ÿค– Blink an LED on Arduino

Hereโ€™s a basic example for an Arduino Uno:

Step 1: Connect your Arduino Uno

Make sure you have the correct drivers. List connected devices:

tinygo flash -target=arduino -list
Enter fullscreen mode Exit fullscreen mode

Step 2: Write Blink Code

package main

import (
    "machine"
    "time"
)

func main() {
    led := machine.LED
    led.Configure(machine.PinConfig{Mode: machine.PinOutput})

    for {
        led.High()
        time.Sleep(time.Millisecond * 500)
        led.Low()
        time.Sleep(time.Millisecond * 500)
    }
}
Enter fullscreen mode Exit fullscreen mode

Step 3: Upload to Your Board

tinygo flash -target=arduino main.go
Enter fullscreen mode Exit fullscreen mode

You should now see your Arduino LED blinking every 0.5 seconds. How cool is that?


๐Ÿงญ Real Life Project: Temperature Sensor and OLED Display

Letโ€™s go a step further. Weโ€™ll build a real embedded solution:

  • Read temperature from a DHT11 Sensor
  • Display it on an I2C OLED screen

๐Ÿ’กHardware Parts

  • Arduino Nano 33 IoT (or similar TinyGo-compatible MCU)
  • DHT11/22 temperature sensor
  • SSD1306 OLED I2C display (128x64)

๐Ÿ“ฆ Install Go Libraries

Clone the TinyGo drivers:

go get tinygo.org/x/drivers
Enter fullscreen mode Exit fullscreen mode

๐Ÿ“„ Code Sample

package main

import (
    "machine"
    "time"
    "tinygo.org/x/drivers/ssd1306"
    "tinygo.org/x/drivers/dht"
    "strconv"
)

func main() {
    i2c := machine.I2C0
    i2c.Configure(machine.I2CConfig{})

    display := ssd1306.NewI2C(i2c)
    display.Configure(ssd1306.Config{})

    sensor := dht.New(machine.D2, dht.DHT11)

    for {
        temp, _, err := sensor.ReadTemperatureHumidity()
        if err == nil {
            display.ClearBuffer()
            msg := "Temp: " + strconv.Itoa(int(temp)) + " C"
            display.WriteString(msg)
            display.Display()
        }
        time.Sleep(2 * time.Second)
    }
}
Enter fullscreen mode Exit fullscreen mode

๐Ÿ‘จโ€๐Ÿ”ฌ What This Project Shows

  • You can write performant device drivers in Go
  • Drive I2C components easily
  • Combine multiple devices with clean structured code

And all of this with the elegance of Go syntax and reliability.


๐Ÿ“ฆ Advanced Use Cases

  • Build wearables with accelerometers
  • Monitor IoT sensors and push data via a WiFi chip
  • Create robot controllers with Go logic
  • Combine TinyGo with WebAssembly for frontend-to-firmware syncing

๐Ÿ“‰ Limitations You Should Know

  • Not all Go stdlib is supported (no net/http on device)
  • Reflection is limited
  • Some features are MCU-specific
  • Debugging is harder than usual (gdb via OpenOCD or BlackMagic)

Still, for many use cases, it works beautifully.


๐Ÿค– Final Thoughts: Is TinyGo Production Ready?

โœ… If your goal is to add some smart logic to tiny hardware with fewer bugs and better documentation, yes.

๐Ÿ”ง If you're building high-end real-time robotics systems, better stick to C/C++ (for now).

But TinyGo is growing fast. What Rust did for systems programming, TinyGo might do for hobbyist and commercial embedded world.


๐Ÿ“š Resources


๐Ÿš€ Now You Know

With TinyGo, youโ€™re no longer shackled to the world of C or high-RAM interpreters. Build reliable, maintainable embedded systems in a language you love.

Give it a shot. Let your Go code blink, beep and monitor the world outside your terminal. ๐ŸŒ ๐Ÿ’ป


Thanks for reading! If you liked this deep dive into TinyGo, share it with your embedded-enthusiast friends. And let me know what you'd like to build with it!

๐Ÿ”ง If you need help bringing your Go code to embedded devices or building out R&D experiments like these โ€” we offer research and development services.

Top comments (1)

Some comments may only be visible to logged-in visitors. Sign in to view all comments.