read adc from a work queue instead of from the timer callback,
because the timer callback runs in an irq context, which means we cannot use usleep & i2c functions