Hi everbody !
I haved modify this sketch to use analog pin and send moisture in percent every 15min.
Im not sure about my "gw.send", I think it will send the value of the soil but without the sign "%" how can I do that ?
thank very much in advance for those who will look at my code
/**
* The MySensors Arduino library handles the wireless radio link and protocol
* between your home built sensors/actuators and HA controller of choice.
* The sensors forms a self healing radio network with optional repeaters. Each
* repeater and gateway builds a routing tables in EEPROM which keeps track of the
* network topology allowing messages to be routed to nodes.
*
* Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
* Copyright (C) 2013-2015 Sensnology AB
* Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
*
* Documentation: http://www.mysensors.org
* Support Forum: http://forum.mysensors.org
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation.
*
*******************************
*
* REVISION HISTORY
* Version 1.0 - Henrik Ekblad
*
* DESCRIPTION
* Example sketch sending soil moisture alarm to controller
* http://www.mysensors.org/build/moisture
*/
#include <SPI.h>
#include <MySensor.h>
#define ANALOG_INPUT_SOIL_SENSOR A0 // Analog input did you attach your soil sensor.
#define ANALOG_INPUT_SOIL_SENSOR1 A1 // Analog input did you attach your soil sensor.
#define ANALOG_INPUT_SOIL_SENSOR2 A2 // Analog input did you attach your soil sensor.
#define ANALOG_INPUT_SOIL_SENSOR3 A3 // Analog input did you attach your soil sensor.
#define INTERRUPT DIGITAL_INPUT_SOIL_SENSOR-2 // Usually the interrupt = pin -2 (on uno/nano anyway)
#define CHILD_ID 0 // Id of the sensor child
#define CHILD_ID_1 1 // moist sensor 2
#define CHILD_ID_2 2 // moist sensor 3
#define CHILD_ID_3 3 // moist sensor 4
MySensor gw;
MyMessage msg(CHILD_ID, V_HUM);
int lastSoilValue = 0;
MyMessage msg1(CHILD_ID_1, V_HUM);
int lastSoilValue1 = 0;
MyMessage msg2(CHILD_ID_2, V_HUM);
int lastSoilValue2 = 0;
MyMessage msg3(CHILD_ID_3, V_HUM);
int lastSoilValue3 = 0;
int soil = 0;
int soil1 = 0;
int soil2 = 0;
int soil3 = 0;
void setup()
{
gw.begin();
// Send the sketch version information to the gateway and Controller
gw.sendSketchInfo("Soil Moisture Sensor", "1.0");
// sets the soil sensor analogique pin as input
pinMode(ANALOG_INPUT_SOIL_SENSOR, INPUT);
pinMode(ANALOG_INPUT_SOIL_SENSOR1, INPUT);
pinMode(ANALOG_INPUT_SOIL_SENSOR2, INPUT);
pinMode(ANALOG_INPUT_SOIL_SENSOR3, INPUT);
// Register all sensors to gw (they will be created as child devices)
gw.present(CHILD_ID, S_HUM);
gw.present(CHILD_ID_1, S_HUM);
gw.present(CHILD_ID_2, S_HUM);
gw.present(CHILD_ID_3, S_HUM);
}
void loop()
{
// Read digital soil value
int soilValue = analogRead(ANALOG_INPUT_SOIL_SENSOR); // Lecture des valeurs du capteur1
soilValue = constrain(soilValue, 485, 1023); // This is taken from an another project on internet with same type of moisture sensor, i will check this value when i receive my sensors
soil = map(soilValue, 485, 1023, 100, 0);
if (soil != lastSoilValue) {
Serial.print("pot 1 : ");
Serial.println(soil);
Serial.print("%");
gw.send(msg.set(soil)); // Send in percent
lastSoilValue = soil;
}
int soilValue1 = analogRead(ANALOG_INPUT_SOIL_SENSOR1); // Lecture des valeurs du capteur2
soilValue1 = constrain(soilValue1, 485, 1023);
soil1 = map(soilValue1, 485, 1023, 100, 0);
if (soil1 != lastSoilValue1) {
Serial.print("pot 2 : ");
Serial.println(soil1);
Serial.print("%");
gw.send(msg1.set(soil1)); // Send in percent
lastSoilValue1 = soil1;
}
int soilValue2 = analogRead(ANALOG_INPUT_SOIL_SENSOR2); // Lecture des valeurs du capteur3
soilValue2 = constrain(soilValue2, 485, 1023);
soil2 = map(soilValue2, 485, 1023, 100, 0);
if (soil2 != lastSoilValue2) {
Serial.print("pot 3 : ");
Serial.println(soil2);
Serial.print("%");
gw.send(msg2.set(soil2)); // Send in percent
lastSoilValue2 = soil2;
}
int soilValue3 = analogRead(ANALOG_INPUT_SOIL_SENSOR3); // // Lecture des valeurs du capteur4
soilValue3 = constrain(soilValue3, 485, 1023);
soil3 = map(soilValue3, 485, 1023, 100, 0);
if (soil3 != lastSoilValue3) {
Serial.print("pot 4 : ");
Serial.println(soil3);
Serial.print("%");
gw.send(msg3.set(soil3)); // Send in percent
lastSoilValue3 = soil3;
}
gw.sleep(15L*15L*1000L); // Timer for checkin every 15min
}
ps: for those who want, here is the link to the project where i took the code to transform in percent the value http://arduinotronics.blogspot.fr/2014/01/when-do-i-water-my-plants-soil.html
edit
After some research i found some thread on the forum -> here talking about this moisture sensor, thank to @mfalkvidd for his code.
I copy this sketch and modify it for my use : no battery for now and add a "if" to it for checking if the value of the moisture have change since the last check (i hope it will save some battery with sending data just when needed)
I just have one more question if someone know... Can I connect all my sensors (4) to the same power pin (in parallele) ?
#include <SPI.h>
#include <MySensor.h>
#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))
#define CHILD_ID_MOISTURE1 0
#define CHILD_ID_MOISTURE2 1
#define CHILD_ID_MOISTURE3 2
#define CHILD_ID_MOISTURE4 3
//#define CHILD_ID_BATTERY 1
#define SENSOR_ANALOG_PIN 0
#define SENSOR_ANALOG_PIN1 1
#define SENSOR_ANALOG_PIN2 2
#define SENSOR_ANALOG_PIN3 3
#define SENSOR_POWER_PIN 8
#define SLEEP_TIME 600000 // Sleep time between reads (in milliseconds) (=10 MINUTES)
#define STABILIZATION_TIME 500 // Let the sensor stabilize before reading
//#define BATTERY_FULL 3700 // 3,700 millivolts
//#define BATTERY_ZERO 1700 // 1,700 millivolts
MySensor gw;
MyMessage msg(CHILD_ID_MOISTURE1, V_HUM);
MyMessage msg2(CHILD_ID_MOISTURE2, V_HUM);
MyMessage msg3(CHILD_ID_MOISTURE3, V_HUM);
MyMessage msg4(CHILD_ID_MOISTURE4, V_HUM);
//MyMessage voltage_msg(CHILD_ID_BATTERY, V_VOLTAGE);
int lastsoilValue1 = 0;
int lastsoilValue2 = 0;
int lastsoilValue3 = 0;
int lastsoilValue4 = 0;
void setup()
{
pinMode(SENSOR_POWER_PIN, OUTPUT);
gw.begin();
gw.sendSketchInfo("Plant moisture w bat", "1.1");
gw.present(CHILD_ID_MOISTURE1, S_HUM);
gw.present(CHILD_ID_MOISTURE2, S_HUM);
gw.present(CHILD_ID_MOISTURE3, S_HUM);
gw.present(CHILD_ID_MOISTURE4, S_HUM);
//delay(250);
//gw.present(CHILD_ID_BATTERY, S_CUSTOM);
}
void loop()
{
digitalWrite(SENSOR_POWER_PIN, HIGH); // Power on the sensors
gw.sleep(STABILIZATION_TIME); //stabilization before mesuring
int moistureLevel = (1023 - analogRead(SENSOR_ANALOG_PIN)) / 10.23; // read moisture of the first sensor
if (moistureLevel != lastsoilValue1) { //test if moisture is different than before
gw.send(msg.set(moistureLevel)); //send to controller moisture level of sensor 1
lastsoilValue1 = moistureLevel;
}
int moistureLevel1 = (1023 - analogRead(SENSOR_ANALOG_PIN1)) / 10.23; // read moisture of the second sensor
if (moistureLevel1 != lastsoilValue2) { //test if moisture is different than before
gw.send(msg2.set(moistureLevel1)); //send to controller moisture level of sensor 2
lastsoilValue2 = moistureLevel1;
}
int moistureLevel2 = (1023 - analogRead(SENSOR_ANALOG_PIN2)) / 10.23; // read moisture of the third sensor
if (moistureLevel2 != lastsoilValue3) { //test if moisture is different than before
gw.send(msg3.set(moistureLevel2)); //send to controller moisture level of sensor 3
lastsoilValue3 = moistureLevel2;
}
int moistureLevel3 = (1023 - analogRead(SENSOR_ANALOG_PIN3)) / 10.23; // read moisture of fourth sensor
if (moistureLevel3 != lastsoilValue4) { //test if moisture is different than before
gw.send(msg4.set(moistureLevel3)); //send to controller moisture level of sensor 4
lastsoilValue3 = moistureLevel3;
}
//debugging comment it when dont use
Serial.print("first plant :");
Serial.println(moistureLevel);
Serial.print("second plant :");
Serial.println(moistureLevel1);
Serial.print("third plant :");
Serial.println(moistureLevel2);
Serial.print("fourth plant :");
Serial.println(moistureLevel3);
digitalWrite(SENSOR_POWER_PIN, LOW); //spower off sensors
//long voltage = readVcc();
//gw.send(voltage_msg.set(voltage / 1000.0, 3)); // redVcc returns millivolts and set wants volts and how many decimals (3 in our case)
//gw.sendBatteryLevel(round((voltage - BATTERY_ZERO) * 100.0 / (BATTERY_FULL - BATTERY_ZERO)));
gw.sleep(SLEEP_TIME);
}
/*long readVcc()
{
// From http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/
// Read 1.1V reference against AVcc
// set the reference to Vcc and the measurement to the internal 1.1V reference
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
ADMUX = _BV(MUX5) | _BV(MUX0);
#elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
ADMUX = _BV(MUX3) | _BV(MUX2);
#else
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#endif
delay(2); // Wait for Vref to settle
ADCSRA |= _BV(ADSC); // Start conversion
while (bit_is_set(ADCSRA, ADSC)); // measuring
uint8_t low = ADCL; // must read ADCL first - it then locks ADCH
uint8_t high = ADCH; // unlocks both
long result = (high << 8) | low;
result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
return result; // Vcc in millivolts
}*/```