I'm using an ESP8266 (NodeMCU Dev Kit v1) to read analog data via an MCP3008 ADC chip.

However I'm receiving only zeros when I know non-zero data should be present. I'm using the following code, which works perfectly when using the MCP3008 with my Arduino UNO. Using verbose mode on compilation, I can confirm that when compiling for the ESP8266, that is indeed linking the ESP8266 SPI library.

Am I missing something here in the code?

#include <SPI.h>

#define CS_PIN 15 // Use 10 when compiling for Arduino

int adcRead(int channel) {
  if ((channel > 7) || (channel < 0)) {
    return -1;

  digitalWrite(CS_PIN, LOW);

  uint8_t r1 = SPI.transfer((channel + 8) << 4);
  uint8_t r2 = SPI.transfer(0);

  digitalWrite(CS_PIN, HIGH);

  return ((r1 & 3) << 8) + r2;

void setup() {
  SPI.setFrequency(1000000); // 1 MHz -- remove line when running on Arduino UNO
  digitalWrite(CS_PIN, HIGH);

void loop() {

In terms of wiring, I have the following

MCP3008   ESP8266
V_DD      3v3
V_REF     3v3
CLK       GPIO14 (D5)
D_OUT     GPIO12 (D6)
D_IN      GPIO13 (D7)
CS        GPIO15 (D8)
  • I dont see any pinMode(CS_PIN, OUTPUT); – SoreDakeNoKoto Apr 23 '16 at 22:29
  • That fixed it! Guess I managed to overlook that. – user1569339 Apr 23 '16 at 22:33

I was having trouble with this code and setup with the Adafruit Feather HUZZAH ESP8266.


In addition to adding the pinMode(CS_PIN, OUTPUT); to setup(), I also dropped the frequency to something much lower. In my case, dropping the frequency to 10000 gave me good readings.

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.