Gabriel Alejandro Giraldo Santiago
Published © GPL3+

Monitoring System for Smart Crops

Design and build a system to monitor the status of your crops using the Netduino 3 WiFi.

IntermediateFull instructions provided5 hours1,553

Things used in this project

Hardware components

Netduino3 WiFi
Wilderness Labs (Netduino) Netduino3 WiFi
×1
Netduino3
Wilderness Labs (Netduino) Netduino3
×1
Netduino3 Ethernet
Wilderness Labs (Netduino) Netduino3 Ethernet
×1
Base Shield V2
Seeed Base Shield V2
×1
Grove - Air quality sensor v1.3
Seeed Grove - Air quality sensor v1.3
×1
Grove - OLED Display 1.12'' V2
Seeed Grove - OLED Display 1.12'' V2
×1
Grove - Sunlight Sensor
Seeed Grove - Sunlight Sensor
×1
Grove - Barometer Sensor (BMP280)
Seeed Grove - Barometer Sensor (BMP280)
×1
Seeed water grove sensor
×1
Seeed Temp&Hum grove sensor
×1
Seeed UV grove sensor
×1

Software apps and online services

Visual Studio 2015
Microsoft Visual Studio 2015
MIT App Inventor

Hand tools and fabrication machines

Computer

Story

Read more

Schematics

CONECTIONS GROVE SENSORS

37160934 1950057818372010 990029363757973504 n (1) gihncqpen9 ulo0ghodq6

Code

PROGRAM.CS

C#
*/
using System;
using System.Net;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using Microsoft.SPOT.Net.NetworkInformation;
using SecretLabs.NETMF.Hardware.Netduino;
using smarCrops.NetMF.Sensor;
using smartCrops.IoT.NetMF;
 
namespace smartCrops.IoT.AdaFruitIO.NetMF.Client
{
   public class Program
   {
      private const string adaFruitIOApiBaseUrl = @"https://IO.adafruit.com/api/v2/";
      private const string group = "netduino3";
      private const string temperatureFeedKey = "t";
      private const string temperatureFeedKey = "te";
      private const string uvFeedKey = "uv";
      private const string airqualityFeedKey = "aq";
      private const string sunlightFeedKey = "s";
      private const string humidityFeedKey = "h";
      private const string barometerFeedKey = "b";
      private const string adaFruitUserName = "YourUserName";
      private const string adaFruitIOApiKey = "YourAPIKey";
      private static readonly TimeSpan timerDueAfter = new TimeSpan(0, 0, 15);
      private static readonly TimeSpan timerPeriod = new TimeSpan(0, 0, 30);
      private static OutputPort led = new OutputPort(Pins.ONBOARD_LED, false);
      private static SiliconLabsSI7005 sensor = new SiliconLabsSI7005();
      private static AdaFruitIoClient adaFruitIoClient = new AdaFruitIoClient(adaFruitUserName, adaFruitIOApiKey, adaFruitIOApiBaseUrl);
 
      public static void Main()
      {
         // Wait for Network address if DHCP
         NetworkInterface networkInterface = NetworkInterface.GetAllNetworkInterfaces()[0];
         if (networkInterface.IsDhcpEnabled)
         {
            Debug.Print(" Waiting for DHCP IP address");
 
            while (NetworkInterface.GetAllNetworkInterfaces()[0].IPAddress == IPAddress.Any.ToString())
            {
               Debug.Print(" .");
               led.Write(!led.Read());
               Thread.Sleep(250);
            }
            led.Write(false);
         }
 
         // Display network config for debugging
         Debug.Print("Network configuration");
         Debug.Print(" Network interface type : " + networkInterface.NetworkInterfaceType.ToString());
         Debug.Print(" MAC Address : " + BytesToHexString(networkInterface.PhysicalAddress));
         Debug.Print(" DHCP enabled : " + networkInterface.IsDhcpEnabled.ToString());
         Debug.Print(" Dynamic DNS enabled : " + networkInterface.IsDynamicDnsEnabled.ToString());
         Debug.Print(" IP Address : " + networkInterface.IPAddress.ToString());
         Debug.Print(" Subnet Mask : " + networkInterface.SubnetMask.ToString());
         Debug.Print(" Gateway : " + networkInterface.GatewayAddress.ToString());
 
         foreach (string dnsAddress in networkInterface.DnsAddresses)
         {
            Debug.Print(" DNS Server : " + dnsAddress.ToString());
         }
 
         Timer humidityAndtemperatureUpdates = new Timer(HumidityAndTemperatureTimerProc, null, timerDueAfter, timerPeriod);
 
         Thread.Sleep(Timeout.Infinite);
      }
 
      static private void HumidityAndTemperatureTimerProc(object state)
      {
         led.Write(true);
 
         try
         {
            double humidity = sensor.Humidity();
 
            Debug.Print(" Humidity " + humidity.ToString("F0") + "%");
            adaFruitIoClient.FeedUpdate(group, humidityFeedKey, humidity.ToString("F0"));
         }
         catch (Exception ex)
         {
            Debug.Print("Humidifty read+update failed " + ex.Message);
 
            return;
         }
 
         try
         {
            double temperature = sensor.Temperature();
 
            Debug.Print(" Temperature " + temperature.ToString("F1") + "°C");
            adaFruitIoClient.FeedUpdate(group, temperatureFeedKey, temperature.ToString("F1"));
         }
         catch (Exception ex)
         {
            Debug.Print("Temperature read+update failed " + ex.Message);
 
            return;
         }
 
         led.Write(false);
      }
 
      private static string BytesToHexString(byte[] bytes)
      {
         string hexString = string.Empty;
 
         // Create a character array for hexidecimal conversion.
         const string hexChars = "0123456789ABCDEF";
 
         // Loop through the bytes.
         for (byte b = 0; b < bytes.Length; b++)          {             if (b > 0)
               hexString += "-";
 
            // Grab the top 4 bits and append the hex equivalent to the return string.
            hexString += hexChars[bytes[b] >> 4];
 
            // Mask off the upper 4 bits to get the rest of it.
            hexString += hexChars[bytes[b] & 0x0F];
         }
 
         return hexString;
      }
   }
}

AdaFruit

C#
*/
using System;
using System.IO;
using System.Net;
using System.Text;
using Microsoft.SPOT;
 
namespace smartcrops.IoT.NetMF
{
   public class AdaFruitIoClient
   {
      private const string apiBaseUrlDefault = @"http://IO.adafruit.com/api/smartcrops/";
      private string apiBaseUrl = "";
      private string userName = "";
      private string apiKey = "";
      private int httpRequestTimeoutmSec;
      private int httpRequestReadWriteTimeoutmSec;
 
      public AdaFruitIoClient(string userName, string apiKey, string apiBaseUrl = apiBaseUrlDefault, int httpRequestTimeoutmSec = 2500, int httpRequestReadWriteTimeoutmSec = 5000)
      {
         this.apiBaseUrl = apiBaseUrl;
         this.userName = userName;
         this.apiKey = apiKey;
         this.httpRequestReadWriteTimeoutmSec = httpRequestReadWriteTimeoutmSec;
         this.httpRequestTimeoutmSec = httpRequestTimeoutmSec;
      }
 
      public void FeedUpdate(string group, string feedKey, string value)
      {
         string feedUrl;
 
         if (group.Trim() == string.Empty)
         {
            feedUrl = apiBaseUrl + userName + @"/feeds/" + feedKey + @"/data";
         }
         else
         {
            feedUrl = apiBaseUrl + userName + @"/feeds/" + group.Trim() + "." + feedKey + @"/data";
         }
 
         HttpWebRequest request = (HttpWebRequest)WebRequest.Create(feedUrl);
         {
            string payload = @"{""value"": """ + value + @"""}";
            byte[] buffer = Encoding.UTF8.GetBytes(payload);
 
            DateTime httpRequestedStartedAtUtc = DateTime.UtcNow;
 
            request.Method = "POST";
            request.ContentLength = buffer.Length;
            request.ContentType = @"application/json";
            request.Headers.Add("X-AIO-Key", apiKey);
            request.KeepAlive = false;
            request.Timeout = this.httpRequestTimeoutmSec;
            request.ReadWriteTimeout = this.httpRequestReadWriteTimeoutmSec;
 
            using (Stream stream = request.GetRequestStream())
            {
               stream.Write(buffer, 0, buffer.Length);
            }
 
            using (var response = (HttpWebResponse)request.GetResponse())
            {
               Debug.Print(" Status: " + response.StatusCode + " : " + response.StatusDescription);
            }
 
            TimeSpan duration = DateTime.UtcNow - httpRequestedStartedAtUtc;
            Debug.Print(" Duration: " + duration.ToString());
         }
      }
   }
}

Credits

Gabriel Alejandro Giraldo Santiago

Gabriel Alejandro Giraldo Santiago

8 projects • 29 followers
I am a young boy with ideal to achieve everything that I propose. Lover of Science, Technology and innovation.

Comments

Add projectSign up / Login