Analog Pins

All ESP8266 boards running MicroPython.
Official boards are the Adafruit Huzzah and Feather boards.
Target audience: MicroPython users with an ESP8266 board.
User avatar
liudr
Posts: 143
Joined: Tue Oct 17, 2017 5:18 am

Re: Analog Pins

Post by liudr » Wed Oct 18, 2017 5:13 pm

mcauser wrote:
Thu Sep 28, 2017 12:05 am
Judging by this page, yes you can use a 74hc4051 multiplexer:
https://internetofhomethings.com/homethings/?p=530
Cool! I like the purple board (and what it represents)! Nicely assembled. Did you hand solder your board?
Price is good too.

Odd. I swear I quoted a different reply. It's about the 74HC4051 breakout board.

User avatar
peaktech99
Posts: 2
Joined: Tue Jul 30, 2019 8:00 pm

Re: Analog Pins

Post by peaktech99 » Tue Jul 30, 2019 8:20 pm

Dear crizeo, dear forum, this is my very first post here..

After days of research and endless attempts of "trial & error" I finally decided to ask for your help. I would like to adapt crizeos code / class to make it work with the MCP3002 ADC which is a variant of the MCP3008 with only two input channels. Somehow, I cannot get the code to work properly, as mcp.read(0) always measures values far beyond 1023, e.g. 2036 or 2044 while the input as well as Vref is attached to 3.3V.

Can anyone help me out with what to change here? As I am new to uPython and SPI I cannot figure out what could be the cause for these strange values. I found a few other examples for the MCP3002/3004/3008, written in "regular" python, using the function spi.write_readinto(...). I think, to address CH_0 at LSB first it should be 0b11010000. But unfortunately I couldn't find a solution, as I am not sure how to manipulate (shift) the bits replied by the MCP3002. :oops: :?:

Thank you very much in advance!

User avatar
peaktech99
Posts: 2
Joined: Tue Jul 30, 2019 8:00 pm

Re: Analog Pins

Post by peaktech99 » Thu Aug 01, 2019 7:31 pm

Meanwhile, I think I found the right combination of bits and bytes to obtain correct values from the MCP3002. Any hints are highly welcome, though! As I'm still new to programming, this is a very first approach. I am sorry not to be able to supply a class yet.

Code: Select all

from machine import SPI, Pin
spi = SPI(1, baudrate=1000000, polarity=0, phase=0)
spi.init

cs = Pin(15, Pin.OUT)
cs.value(0)
cs.value(1)
cs.value(0)

# Control & Data Registers:
# See datasheet for more information
# send 8 bit control :
# X, Strt, SGL|!DIFF, ODD|!SIGN, MSBF, X, X, X
# 0, 1,    1=SGL,     0 = CH0  , 0   , 0, 0, 0 = 96d

buffer = bytearray([96,0])
print("MOSI - first Byte:",bin(buffer[0]))
print("MOSI - second Byte:",bin(buffer[1]),"\n")
#print(bin(buffer[2]))

read = bytearray(2) 
spi.write_readinto(buffer,read)
cs.value(1)
spi.deinit()

# receive 10 bit data :
# receive data range: 000..3FF (10 bits)
# MSB first: (set control bit in cmd for LSB first)
# spidata[0] =  X,  X,  X,  X,  X,  0, B9, B8
# spidata[1] = B7, B6, B5, B4, B3, B2, B1, B0
# LSB: mask all but B9 & B8, shift to left and add to the MSB

print("MISO / raw - first Byte: ",bin(read[0]))
print("MISO / altered - first Byte: ",bin((read[0] & 3) << 8))
print("MISO - second Byte, OK as it is: ",bin(read[1]))
print("MISO / altered - all together: ",bin(((read[0] & 3) << 8) + read[1]))

value = (((read[0] & 3) << 8) + read[1])
print("ADC-value: ",value)
print("measured Voltage: ",((3.305/1023.0)*value),"V")

Post Reply