Looking forward starting a project to have my plant taken care with arduino.
I am running an Arduino UNO, own a DHT11 Temperature sensor and moisture one.
A simple RJ45 network shield and a lcd shield.
I wanted to have all my sensors reading information for the plant, display them on the 16x2 LCD, and send the data vie network so I can review it.
I am having some doubts if it is possible to deploy all that together or it might be too much for the arduino UNO. Also, when using shields... like the LCD one, goes on top of the UNO, How can I use the non-used pins?
Thanks, any help will be usefull, can post pictures and as the projects starts to run< I will send info.
This project is definitely doable with an uno. In fact, I have done a project (greenhouse controller: LCD, ENC28J60 ethernet board, DHT11, light sensor, temperature sensor, water valve, fan, window vent motor and evaporative cooler) almost exactly like what you have described. My advice is to start small and write simple sketches, one for each component. Then combine and integrate. Using shields is easier but sometimes limits your flexibility with pins.
I added the DHT11 temperature sensor, it works perfect under serial printing, when I try to print the same variables on the lcd, I got error I cant print a float on the lcd. I couldn't find a simple way to convert it to string.
I chopped the code so it could fit here.
Any ideas??
const int sensorpin=0;
int moisture=0;
int lastWaterVal=0;
int led = 8;
#define MOIST 450 // minimum level of satisfactory moisture
#define DRY 350 // maximum level of tolerable dryness
#define SOAKED 600 // minimum desired level after watering
#define WATERING_CRITERIA 100 // minimum change in value that indicates watering
//TEMP begin
// PURPOSE: DHT11 library test sketch for Arduino
//
//Celsius to Fahrenheit conversion
double Fahrenheit(double celsius)
{
return 1.8 * celsius + 32;
}
// fast integer version with rounding
//int Celcius2Fahrenheit(int celcius)
//{
// return (celsius * 18 + 5)/10 + 32;
//}
//Celsius to Kelvin conversion
double Kelvin(double celsius)
{
return celsius + 273.15;
}
// dewPoint function NOAA
// reference: http://wahiduddin.net/calc/density_algorithms.htm
double dewPoint(double celsius, double humidity)
{
double RATIO = 373.15 / (273.15 + celsius); // RATIO was originally named A0, possibly confusing in Arduino context
double SUM = -7.90298 * (RATIO - 1);
SUM += 5.02808 * log10(RATIO);
SUM += -1.3816e-7 * (pow(10, (11.344 * (1 - 1/RATIO ))) - 1) ;
SUM += 8.1328e-3 * (pow(10, (-3.49149 * (RATIO - 1))) - 1) ;
SUM += log10(1013.246);
double VP = pow(10, SUM - 3) * humidity;
double T = log(VP/0.61078); // temp var
return (241.88 * T) / (17.558 - T);
}
// delta max = 0.6544 wrt dewPoint()
// 5x faster than dewPoint()
// reference: http://en.wikipedia.org/wiki/Dew_point
double dewPointFast(double celsius, double humidity)
{
double a = 17.271;
double b = 237.7;
double temp = (a * celsius) / (b + celsius) + log(humidity/100);
double Td = (b * temp) / (a - temp);
return Td;
}
#include "dht11.h"
dht11 DHT11;
#define DHT11PIN 2
//temp end
void setup (){
pinMode(led, OUTPUT);
Serial.begin(115200);
Serial.println("Soil Moisture Module v1.1: Loaded");
Serial.println("DHT11 TEST PROGRAM ");
Serial.print("LIBRARY VERSION: ");
Serial.println(DHT11LIB_VERSION);
Serial.println();
Serial.println();
LcdInitialise();
LcdClear();
LcdString("Soil Moisture Module v1.1: Loaded");
}
void loop (){
Serial.println("\n");
int chk = DHT11.read(DHT11PIN);
Serial.print("Read sensor: ");
switch (chk)
{
case DHTLIB_OK:
Serial.println("OK");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.println("Checksum error");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.println("Time out error");
break;
default:
Serial.println("Unknown error");
break;
}
Serial.print("Humidity (%): ");
Serial.println((float)DHT11.humidity, 2);
Serial.print("Temperature (oC): ");
Serial.println((float)DHT11.temperature, 2);
Serial.print("Temperature (oF): ");
Serial.println(Fahrenheit(DHT11.temperature), 2);
Serial.print("Temperature (K): ");
Serial.println(Kelvin(DHT11.temperature), 2);
Serial.print("Dew Point (oC): ");
Serial.println(dewPoint(DHT11.temperature, DHT11.humidity));
Serial.print("Dew PointFast (oC): ");
Serial.println(dewPointFast(DHT11.temperature, DHT11.humidity));
moisture=analogRead(sensorpin);
LcdInitialise();
LcdClear();
if (moisture >= SOAKED && lastWaterVal < MOIST) {
Serial.println(moisture);
// LcdString(moisture);
digitalWrite(led, LOW);
Serial.println("Thank you for watering me!");
LcdString("Thank you for watering me! :D");
}
else if (moisture >= SOAKED && lastWaterVal >= MOIST ) {
Serial.println(moisture);
// LcdString(moisture);
digitalWrite(led, HIGH);
delay (800);
digitalWrite(led, LOW);
Serial.println("You over watered me");
}
else if (moisture < SOAKED && lastWaterVal < MOIST ) {
Serial.println(moisture);
// LcdString(moisture);
digitalWrite(led, HIGH);
Serial.println("You didn't water me enough");
}
lastWaterVal = moisture; // record the watering reading for comparison next time this function is called
delay (5000);
}
These are the the inputs I want to print on my lcd>