klingberg

klingberg

Adafruit STEMMA Soil Sensor - I2C

Hi there!

I am kind of new to nerves and electronics and was hoping that someone here could give me some pointers.
I struggle with reading the soil sensor connected to a raspberry pi zero.

I2C.detect_devices gives:
Devices on I2C bus “i2c-1”:

  • 54

The documentation says that the default address for the sensor is 0x36.
When I try to read from the sensor all I get is <<255>>?

I2C.read(ref, 0x36, 11) gives:
{:ok, <<255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255>>}

If anyone has any experience with this sensor or could explain whats going on here I would really appreciate it!

Most Liked

fhunleth

fhunleth

Co-author of Nerves

Hi klingberg!

For I2C, it’s normal to send a command to the device and then do the read. For example, a command could be to return the current soil moisture and then you’d read a few bytes back that would be the soil moisture.

The API for talking to devices is normally found in something called a datasheet that you can download from the manufacturer. I took a quick look at the soil sensor link. From what I can tell, Adafruit has a microcontroller on the soil sensor board and they programmed it themselves with something called the seesaw firmware.

I could not find a datasheet or API guide that lists commands from Adafruit, but they do have Python code that “documents” the interface. See the moisture_read function in seesaw.py.

Reading the code, it looks like the function sends something related to _TOUCH_BASE and _TOUCH_CHANNEL_OFFSET and then reads into buf (which is 2 bytes):

self.read(_TOUCH_BASE, _TOUCH_CHANNEL_OFFSET, buf, .005)

Going to the read function, it looks like it writes _TOUCH_BASE, _TOUCH_CHANNEL_OFFSET to the device, sleeps 0.005 seconds and then reads 2 bytes.

Translating this to Elixir, I’d try:

I2C.write(ref, 0x36, <<0x0f, 0x10>>)
Process.sleep(5)
{:ok, <<value::little-size(16)>> = I2C.read(ref, 0x36, 2)

_TOUCH_BASE = 0x0f and _TOUCH_CHANNEL_OFFSET = 0x10

Based on Adafruit’s code, it looks like they retry if value > 4095.

Hope this helps!

klingberg

klingberg

Great! This is very helpful, thank you very much!!

I will give this a try as soon as I can!
Will let you know how it goes!

Thanks again!

Where Next?

Popular in Questions Top

aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
Tee
can someone please explain to me how Enum.reduce works with maps
New
fireproofsocks
I’m working on defining a simple Ecto schema for a table (in PostGres), but I don’t see where I can define a column as NOT NULL. Conside...
New
JulienCorb
I am trying to implement my new.html.eex file to create new posts on my website. new.html.eex: &lt;h1&gt;Create Post&lt;/h1&gt; &lt;%= ...
New
Lily
In templates/appointment/index.html.eex: &lt;%= for appointment &lt;- @appointments do %&gt; &lt;tr&gt; &lt;td&gt;&lt;%= appoi...
New
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
itssasanka
Hi all, Trying to get some more clarity over utc_datetime and naive_datetime for Ecto: The documentation above suggests that while ...
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
srinivasu
How to handle excepions in elixir? Suppose i have A, B, C ,D, E modules. and each module has get() function. A.get() method will call t...
New

Other popular topics Top

marius95
Hello everyone, I try to use an Javascript Event Handler in my root.html.leex file. Therefore I created a function in the app.js file: ...
New
9mm
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
gausby
I asked this very same question on twitter and got some interesting feedback, but I thought it would be a good question to ask here as we...
1207 39297 209
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
axelson
This post is a wiki (feel free to hit the edit button near the bottom right of this post to add your own changes!) This post collects co...
239 47930 226
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
PeterCarter
There are pre-rolled solutions for other frameworks that do work. However, Phoenix does not seem to have these. Have people had good expe...
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New

We're in Beta

About us Mission Statement