package main import ( "image/color" "machine" "time" "tinygo.org/x/drivers/encoders" "tinygo.org/x/drivers/ws2812" ) func main() { // WS2812 LEDs are on pin P1_11 neo := machine.P1_11 neo.Configure(machine.PinConfig{Mode: machine.PinOutput}) leds := ws2812.New(neo) ledColors := make([]color.RGBA, 2) // rotary encoder: A=P1_00, B=P0_24; push button=P0_22 enc := encoders.NewQuadratureViaInterrupt(machine.P1_00, machine.P0_24) enc.Configure(encoders.QuadratureConfig{Precision: 4}) btnRot := machine.P0_22 btnRot.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) var k uint8 for { // pressing the rotary button resets position to zero if !btnRot.Get() { enc.SetPosition(0) } // encoder position cycles through the rainbow k = uint8(enc.Position()) ledColors[0] = getRainbowRGB(k) ledColors[1] = getRainbowRGB(k + 85) leds.WriteColors(ledColors) time.Sleep(20 * time.Millisecond) } } func getRainbowRGB(i uint8) color.RGBA { if i < 85 { return color.RGBA{i * 3, 255 - i*3, 0, 255} } else if i < 170 { i -= 85 return color.RGBA{255 - i*3, 0, i * 3, 255} } i -= 170 return color.RGBA{0, i * 3, 255 - i*3, 255} }