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  }