Soil Moisture Sensor Example Project


I say, if your knees aren’t green by the end of the day, you ought to seriously re-examine your life. ~Bill Watterson, Calvin & Hobbes

Green-thumbed techno junkies rejoice!  For today, we’re going to take an introductory, prototype look at what it takes to digitally monitor the soil moisture content of a common houseplant so we know when to water it.  We’re talking about using a single board computer to read from a soil moisture sensor from an Analog to Digital Convertor (ADC) and toggle an indicator LED using Digital Input and Output (DIO). Specifically, we’re going to be using a TS-7250-V2, but this guide can apply to many different boards.

Admittedly, the TS-7250-V2 is a bit overkill for the scope of this simple project, where a simple microcontroller would work, but it does provide us with a solid foundation for full-fledged autonomous garden projects. The TS-7250-V2 has five ADC channels, so you could hook it up to five different watering zones.  It also has plenty of DIO pins for controlling and interfacing with external hardware, like turning on or off water pipes for example.  Where things get really interesting is having the ability to run a web or API server from the Linux-powered board for access from anywhere in the world.  So, there’s definitely room to grow here (pun intended). With that, let’s dig in.

Things We’ll Need

Here’s a list of the items we’ll be prototyping with today:

Setting Up The Hardware

Where the rubber meets the road, or rather, where the sun meets the photosynthesizer.  We’re going to hook up our components to the single board computer.  For the soil moisture sensor, we need power, ground, and an ADC channel for the signal wire.  

In order to prevent oxidation of the probes, we’re not going to apply constant power.  Instead, we’re going to hook it up to a 3.3 VDC DIO pin so we can turn it on only when we’re ready to read what’s on the signal wire.  We’ll call this our power enable pin.  In order to visually see when power to the moisture sensor is active, we’re going to hook up a yellow LED to the DIO pin as well.  Finally, we’re going to need some sort of indicator to let us know when the plant needs watering, so we’re going to hook up a red LED to another DIO pin.  What we’re left with is something resembling the wiring diagram below.  

Notice, we’re connected to the DIO and A/D headers.  The red LED is connected to DIO_03, or GPIO #77 in software.  The power enable wire is connected to DIO_01, or GPIO #76 in software, which powers our moisture sensor and yellow LED.  A ground pin for all of our components is conveniently located on DIO_01.  After connecting everything, we can continue to software development, but before we do, let’s talk about protecting our sensor.

As we all know, electricity and water don’t get along, so before we go sticking our sensor into a moist environment, we should protect it.  For indoor applications, simply using hot glue can provide good protection.  For outdoor applications, hot glue won’t hold up to the sunshine and other elements very well, so conformal coating would be much better.  Here, we’re working with an indoor houseplant, so hot glue was used, as seen in the image below.

Okay, let’s move onto the exciting software stuff!

Programming The Software

Tighten up your thinking cap; we’re going to unearth some C code.  Now, this could very well be done in Python or another language, but we had some example C code already provided by Technologic Systems.  Also, those coming from a microcontroller world might be more comfortable in implementing their hardware in C/C++, so we’ve shaped the ground to match that sort of landscape.

Start by taking a look at the code at the embeddedarm/soil-watcher git repository.  There are several files here including the example C code pulled directly from Technologic Systems called evgpio.cand evgpio.h.  The evgpio library takes care of all the dirty details of dealing with the somewhat unique event driven GPIO of the TS-7250-V2.  This is about the only thing specific to this example project.  For other boards, you’ll need to utilize your own GPIO library.  If your board happens to use the popular GPIO sysfs interface, you’re in luck because we have example code available here in Cand here in C++.   Otherwise, refer to your board manual. With that said, let’s take a look at the main event — soil-watcher.c.

Essentially, what we’re looking at is a program that has a few functions, but primarily main(), setup() and run().  The setup() function sets everything up initially, preparing our system by turning off LEDs and initializing the GPIO pins.  The run() function contains an infinite while loop that will continually monitor soil moisture readings and control the sensor power and red LED.  The main() function simply parses command line parameters and calls setup() and run().  The other functions are mainly just helper functions.  The code was heavily commented to make it easy to digest and understand so that we don’t have to dig into too many overwhelming details in this writeup.  

Here’s what our program outputs as I leave it sit on my desk and then touch the two prongs together with my fingers:

One of the finer points of our soil-watcher.c program is the (totally optional) ability to run as a daemon. This allows us to run the program in the background so-to-speak, although what’s actually happening is a little more complex.  What we care about is that it frees up our shell as our program goes about its own way.  We can see it running by using ps ax | grep soil-watcher.

This also redirects all output that the program would normally generate to /dev/null.  So, no logging will be available using this method.

The next thing we’ll want to do with our program is make it start automatically when the system powers on.  There are a few different ways of doing this, but the most popular is to add a init.d or systemd (example) script.  For our TS-7250-V2, we’ll use init.d, as documented in the “Starting Automatically” section of the TS-7250-V2 manual.  The file has already been created for you as  To get it working on startup, follow these commands:

The next thing we’ll want to do with our program is make it start automatically when the system powers on.  There are a few different ways of doing this, but the most popular is to add a init.d or systemd (example) script.  For our TS-7250-V2, we’ll use init.d, as documented in the “Starting Automatically” section of the TS-7250-V2 manual.  The file has already been created for you as  To get it working on startup, follow these commands:

Then, when you reboot your system, our soil-watcher program should be running.

Closing Remarks

Now, the prototyping phase is over.  If you’re satisfied with this mini-application, then you could start figuring out how to enclose the system and make it look like a finished product.  

I would start by creating a false bottom in the planter in which to house the board and wiring. Then, I’d run some sort of flexible, thin conduit in which to run the wires for the LED and moisture sensor.  A hole would be drilled in the planter and the red LED mounted in that hole, so it’s visible from the outside of the plant.  Then, whenever I was walking by and seen the red LED, I would know it’s time to water the plant.

Really, this is just the tip of the iceberg.  The principles taught in this tiny project of using DIO and ADC pins are applicable to many situations and projects.  As mentioned earlier, using the TS-7250-V2 single board computer is massively overkill for this tiny project, but you now have a powerful and sturdy foundation on which to build so much more, which I hope you’ve felt inspired to do so.  

If I were to take this further, I would want to build an automated garden with five different watering zones, hooked up to relays and solenoids to control water flow.  I’d incorporate an online dashboard into the project by utilizing the Apache webserver and MySQL database to track and display historical data. With Node.js easily installable, I’d bring some IoT flare to the table by creating a REST API which I could use to monitor my soil in real time and open water valves with the push of a button on my phone.


Adventures in Home Security Surveillance with a TS-7970

As you may have seen in my TS-7970 Home Security Systems video on YouTube, I took a TS-7970 quad core single board computer and built it into my very own home security system using the open source software Zoneminder. This product works very well for the two camera system that I have hooked up. In case you didn’t get a chance to see the video, I wanted a security system that was cost effective and still worked well with the capability to expand if I so desired. I was referred to Zoneminder by a good friend and coworker of mine. Since I work at Technologic Systems I thought it would be cool to be able to use one of our boards to build up this camera system. After getting approval to use one of our boards my journey began on making my very own security system a reality.

To start out I am NOT a software developer. However, with the available user guides, and the occasional help from my co-worker friend, I got the system working. When starting out I originally used a TS-7970 solo SBC to begin my project using a board from work that I prepared as if shipping to a customer including an 8GB micro SD card. Once I got home I got to work on the project. I have to say Zoneminder has some great install guides. They take you 80% of the way when using this SBC, the other 20% was trial and error and a little help from my friend that knows Debian much better than I. Once I got set up on my computer I connected to the board using the USB B port and TeraTerm on my computer. I booted the TS-7970 up to its main prompt and began following the Install guide on Zoneminder’s wiki for debian systems:

First thing I had to do in the system was to create a password for the root user. Once I did that I did apt-get update  to make sure I was up to date. I then installed PHP, MySQL, and Zoneminder which also included installing apache web server onto the TS-7970. To install some of those packages I had to make sure to add the Jessie backports to my sources.list file (as mentioned in the guide). It took some time to do everything in the right order and to get it to work perfect. I believe I honestly had to do this three times to get the system working how I wanted it to. Again, I remind you I am NOT a software developer so I may have done stuff on accident that a normal more software savvy individual would not have. Once Zoneminder was installed I had to create a MySQL database that Zoneminder could use. Then I had to add Zoneminder to start automatically when the board boots. To get the apache web server to work properly I had to create a new user to the sudo group. Many fine tuning settings later my board was running Zoneminder and I could hook up my cameras that I purchased.

I was able to log into the Zoneminder web GUI and setup my cameras. This is specific to your cameras that you would use. The Zoneminder web service does well and has many options to tweak, many more than what I need in fact. Once I got the system up and running I was now able to tweak the cameras to detect motion and set the resolution. Mind you this is still on the TS-7970 solo board. I noticed that the FPS on the captured frames was around 8 frames per second, which I guess is normal for surveillance systems, but I wanted more, so I swapped out the TS-7970 solo for a quad core. By doing that I had to start all over and reinstall the security system. This time I also did some port changes for the apache server to go through the router, as well as API permissions so that only authorized users can access my system from the outside world.

After getting the TS-7970 quad core board up and going I was getting 20+ FPS on my captured video, much better! I was very happy with how this project came out, I now have a security system that is running on a single board computer that could honestly be installed almost anywhere since it is wifi capable, and is capable of running in environments that other boards are not. I could see this setup being used as a standalone server in multiple locations for a business with all of them sending the captures off to a single server over the internet. All of this is made possible by the TS-7970’s powerful hardware, it is definitely a great little system for this project.

After several months of use, the system is still working flawlessly, I have now downloaded ZM Ninja from the iOS store so I could have a nice app to check on my security system with. I also have a sweet base made by one of my coworkers at our office using our 3D printer (which also uses one of our boards as a print server), I have been very happy with this product but I still wanted to tinker because our little TS-7970 quad core board had more features available to use. One thing that would have been nice is more storage to keep events longer. My friend had an amazing idea of using the mSATA on the TS-7970, so I went on a search for a mSATA drive to use on my little security project. Two days later I received my mSATA drive and once I got home I turned off the board, installed the mSATA, and powered on the board. Immediately linux recognized the 32GB mSATA device. Using this guide: I followed it step by step only to run into a few technicalities of binding and mounting folders, as well as getting the drive to mount automatically. After only about an hour worth of tinkering, my system was back up and running using this fancy new fast mSATA device with tons more storage. After adding the 32GB mSATA to the TS-7970 I noticed immediately an improved playback on the video when reviewing the stored footage. I was impressed to say the least.


Example XBee Project: Opened Door Alert via Email/SMS

Imagine this: You have a five-year-old son who has grown tall enough, and smart enough to open the door to your home office, packed with all your super fun gizmos and trinkets. It has a lock, but being the lackadaisical creature you are, you forget to lock it. You’ll only be gone for a minute or two, after all! Well, that was just enough time for your son to sneak in, rip up all the jumper wires from your breadboard, find a permanent marker, and well, you know how this ends.

In this (oddly specific) example project we’re going to be coming up with a solution to avoid such a disaster by building a wireless, internet connected, SMS door alert system using:

This way, we’ll receive a text message every time the door is opened and be able to rush to the scene of the future crime.
Continue reading “Example XBee Project: Opened Door Alert via Email/SMS”

Implementing a BACnet System Utilizing the TS-7680

BACnet is a data communication protocol for Building Automation and Control Networks. Developed by the American Society of Heating, Refrigerating and Air-Conditioning Engineers (ASHRAE), BACnet is a national standard in more than 30 countries around the world, and an ISO global standard. It was created to have a unified communication system for different devices across different manufacturers. Manufacturers of BACnet devices create a wide range of monitor and control modules, from basic IO, to analog, to specialized devices such as gas monitors.

Continue reading “Implementing a BACnet System Utilizing the TS-7680”

All Your Base(plate) Are Belong to Us!

Print Your Own Baseplate for Development and Prototyping


A new development baseplate and accessories for the TS-7670, TS-7680, and TS-7970 are now available for 3D printing. The main baseplate features standoffs for securing the single board computer (SBC), clip mounts for cable management, and tabs for attaching accessory boards. The accessory boards include a full sized breadboard mounting plate, and two (vertical and horizontal) half-sized breadboard mounting plates with compartments for organizing resistors and components. Two different sized cable clips are also included. You can download the STL files for 3D printing by referring to the product webpage in the resources tab, or directly here:

Development Baseplate and Accessories for 3D Printing

Continue reading “All Your Base(plate) Are Belong to Us!”

Case Study: TS-7680 IoT Solution Provides Real Time Pool Temperatures to Keep Visitors Dreaming of Their Next Trip


In a continuing effort to usher their spa into the 21st century and stay top of mind with customers, Bozeman Hot Springs set out to provide real-time pool temperature data for their customers. They found an off-the-shelf solution with Technologic Systems which could integrate with their existing commercial automation controllers and serve temperature data over a REST API.

Continue reading “Case Study: TS-7680 IoT Solution Provides Real Time Pool Temperatures to Keep Visitors Dreaming of Their Next Trip”

The Weather Outside Is Frightful (Or Is It?)

Blistery cold weather is starting to sink in, which ought to ignite an instinctual desire to get your house in order and monitor it so the water pipes don’t freeze and burst. So, we’ll take a timely look at a project setting up some temperature probes in various areas, reading them, and reporting in a custom dashboard. A true home automation expert would take things further by setting up relays to turn on heat tape or even maybe some actuators to control water flow. Maybe next year, but for now, we just want to be able to monitor important areas of our home (in this case a cabin in Montana) and understand temperature patterns over time for better planning. As with most projects, there is more than one solution, especially if it depends on what you have on hand. At the time, the list of things in hand were as follows:

Continue reading “The Weather Outside Is Frightful (Or Is It?)”

Collaborative Digital Signage Project

Real-Time Company Announcements and Information Using Multiple Touch Panel PCs


This project aims to improve the communication of company events, key performance metrics, and collaboration through several strategically mounted touch panel computers (TPCs) throughout the building. It also serves as an inspirational digital signage application for potential customers using our TPCs. Skimming through the technical details, you’ll find the screens are powered by our very own TS-TPC-8950-4900, a 10” resistive TPC running Debian Linux, a fullscreen, kiosk-mode browser, and a custom node.js web app.

Continue reading “Collaborative Digital Signage Project”

Demonstrating the TS-SILO Power Reserve Solution

Eliza Nelson, our Field Applications Engineer, takes some time during the Embedded Systems Conference (ESC) in Minneapolis to show us a demo on the new TS-SILO super capacitor, power reserve solution.  In the video, a TS-7680 equipped with onboard TS-SILO gets it’s power feed mercilessly taken away in an ever lasting loop every minute or so.  Thanks to the TS-SILO, it has time to gracefully shutdown each time.  Power is restored, the TS-SILO gets fully charged again in under a minute, and power is ripped away again.  Enjoy the video!

NetBSD Toaster Powered by the TS-7200 ARM9 SBC

It has long been regarded that the UNIX-like OS NetBSD is portable to every type of machine except perhaps your kitchen toaster. Technologic Systems, however, has conquered this last frontier. Using the rugged, embedded TS-7200 single board computer housed inside the empty space of a standard two slice toaster, Technologic Systems has designed a functional NetBSD controlled toaster.


Continue reading “NetBSD Toaster Powered by the TS-7200 ARM9 SBC”