gobot.io/x/gobot/v2@v2.1.0/examples/digispark_pca9501.go (about) 1 //go:build example 2 // +build example 3 4 // 5 // Do not build by default. 6 7 package main 8 9 import ( 10 "fmt" 11 "time" 12 13 "gobot.io/x/gobot/v2" 14 "gobot.io/x/gobot/v2/drivers/i2c" 15 "gobot.io/x/gobot/v2/platforms/digispark" 16 ) 17 18 // Program use EEPROM with GPIO to rotate pins, get best experience, when 19 // add LED's between +5V and each pin with an resistor of ~180 Ohm. 20 // 21 // Procedure: 22 // * write value to EEPROM 23 // * read value back from EEPROM and check for differences 24 // * use read value to set GPIO 25 func main() { 26 board := digispark.NewAdaptor() 27 pca := i2c.NewPCA9501Driver(board, i2c.WithAddress(0x04)) 28 var addressMem uint8 = 0x00 29 var valMemW uint8 = 0xFF 30 var valMemR uint8 31 var pin uint8 = 0 32 var newPin uint8 = 0 33 var pinState uint8 = 0 34 var err error 35 36 work := func() { 37 gobot.Every(50*time.Millisecond, func() { 38 // write a value 0-255 to EEPROM address 255-0 39 addressMem-- 40 valMemW++ 41 err = pca.WriteEEPROM(addressMem, valMemW) 42 if err != nil { 43 fmt.Println("err MEMw:", err) 44 } 45 46 // write process needs some time, so wait at least 5ms before read a value 47 // when decreasing to much, the check below will fail 48 time.Sleep(5 * time.Millisecond) 49 50 // read value back and check for unexpected differences 51 valMemR, err = pca.ReadEEPROM(addressMem) 52 if err != nil { 53 fmt.Println("err MEMr:", err) 54 } 55 if valMemW != valMemR { 56 fmt.Printf("addr: %d valMemW: %d differ valMemR: %d\n", addressMem, valMemW, valMemR) 57 } 58 // convert it to a pin 0-7 59 newPin = valMemR % 8 60 // write only when something has changed 61 if newPin != pin { 62 pin = newPin 63 fmt.Println("set Pin:", pin, "to:", pinState) 64 err = pca.WriteGPIO(pin, pinState) 65 if err != nil { 66 fmt.Println("err GPIO:", err) 67 } 68 // when all LED's are on switch off 69 if pin >= 7 { 70 if pinState == 0 { 71 pinState = 1 72 } else { 73 pinState = 0 74 } 75 } 76 } 77 }) 78 } 79 80 robot := gobot.NewRobot("rotatePinsI2c", 81 []gobot.Connection{board}, 82 []gobot.Device{pca}, 83 work, 84 ) 85 86 err = robot.Start() 87 if err != nil { 88 fmt.Println(err) 89 } 90 }