// Conectare pini ( Legenda )
// Pin D2 - Senzor debit YF-S401.(1)
// Pin D3 - Senzor debit YF-S401.(2)
// Pin D4 - Releu pornire Pompa1.
// Pin D5 - Releu pornire Pompa2.
// Pin D6 - Senzor temperatura si umiditate DHT21/AM2301 ( interior sera ).
// Pin D7 - Senzor temperatura si umiditate DHT21/AM2301 ( exterior ).
// Pin D8 - STEP-PIN deschidere usa-sera.
// Pin D9 - DIR-PIN deschidere usa-sera.
// Pin D10 - ENABLE-PIN deschidere usa-sera.
// Pin D11 - STEP-PIN deschidere fereastra-sera.
// Pin D12 - DIR-PIN deschidere fereastra-sera.
// Pin D13 - ENABLE-PIN deschidere fereastra-sera.
// Pin D18 - Senzor temperatura apa DS18B20.
// Pin D26 - Releu pornire Iluminat.
// Pin D27 - Releu pornire Ventilatie.
// Pin D48 - Senzor distanta HC-SR04.
// Pin D49 - Senzor distanta HC-SR04.
// Pin SDA - Senzor temperatura si presiune atmosferica BMP180.
// Pin SCL - Senzor temperatura si presiune atmosferica BMP180.
// Pin A1 - Senzor umiditate sol (1).
// Pin A2 - Senzor umiditate sol (2).
// Pin A3 - Senzor umiditate sol (3).
// Pin A4 - Senzor umiditate sol (4).
// Pin A5 - Senzor umiditate sol (5).
// Pini virtuali ( Legenda )
// Pin virtual 1 - Senzor temperatura apa in bazin DS18B20.
// Pin virtual 2 - Presiune atmosferica BMP180.
// Pin virtual 3 - Temperatura exterior-umbra BMP180.
// Pin virtual 4 - Actionare Pompa1.
// Pin virtual 5 - Actionare Pompa2.
// Pin virtual 8 - Nivel apa bazin HC-SR04.
// Pin digital 10 - Senzor pentru umiditatea solului (1).
// Pin digital 11 - Senzor pentru umiditatea solului (2).
// Pin digital 12 - Senzor pentru umiditatea solului (3).
// Pin digital 13 - Senzor pentru umiditatea solului (4).
// Pin digital 14 - Senzor pentru umiditatea solului (5).
// Pin digital 16 - Temperatura Sera DHT21/AM2301.
// Pin digital 17 - Umiditate Sera DHT21/AM2301.
// Pin digital 18 - Temperatura Exterior-Lumina DHT21/AM2301.
// Pin digital 19 - Umiditate Exterior-Lumina DHT21/AM2301.
// Pin digital 20 - Deschidere Geam-Sera.
// Pin digital 21 - Inchidere Geam-Sera.
// Pin digital 22 - Apa Irigare Pompa-1.
// Pin digital 23 - Apa Irigare Pompa-2.
// Pin digital 24 - Deschidere Usa-Sera.
// Pin digital 25 - Inchidere Usa-Sera.
// Pin digital 26 - Actionare Iluminat.
// Pin virtual 27 - Actionare ventilatie.
// Librariile necesare pentru Automatizare
#define CAYENNE_PRINT Serial
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085_U.h>
#include <Ultrasonic.h>
#include <DHT.h>
#include <CayenneMQTTESP8266Shield.h>
// Conectare WI-FI
char ssid = “”;
char wifiPassword = “”;
// Autorizarea catre siteul MyDevices.Com
char username = “”;
char password = “”;
char clientID = “”;
// Pinul virtualal pentru senzorul de temperatura exterior/presiunea atmosferica (BMP180)
#define VIRTUAL_PIN2 V2
#define VIRTUAL_PIN3 V3
// Pin-urile pentru DHT21/AM2301
#define VIRTUAL_PIN6 V6 // Pin digital pentru senzorul DHT21
#define VIRTUAL_PIN7 V7 // Pin digital pentru senzorul DHT21
#define DHT1PIN 6 // Pin conectare pe placa pentru senzorul DHT21
#define DHT2PIN 7 // Pin conectare pe placa pentru senzorul DHT21
#define DHT1TYPE DHT21 // DHT 21
#define DHT2TYPE DHT21 // DHT 21
DHT dht1(DHT1PIN, DHT1TYPE);
DHT dht2(DHT2PIN, DHT2TYPE);
unsigned long lastMillis = 0;
// Pin-urile pentru relee
#define VIRTUAL_PIN4 V4 // Pin digital pentru releu Pompa1.
#define VIRTUAL_PIN5 V5 // Pin digital pentru releu Pompa2.
#define VIRTUAL_PIN26 V26 // Pin digital pentru releu Ventilatie.
#define VIRTUAL_PIN27 V27 // Pin digital pentru releu Iluminat.
#define RELAY_DIGITAL_PIN1 V4 // Pin conectare pe placa pentru releu Pompa1.
#define RELAY_DIGITAL_PIN2 V5 // Pin conectare pe placa pentru releu Pompa2.
#define RELAY_DIGITAL_PIN26 V26 // Pin conectare pe placa pentru releu Ventilatie.
#define RELAY_DIGITAL_PIN27 V27 // Pin conectare pe placa pentru releu Iluminat.
// Pin digitale/logic pentru senzorul de masurare a cantitatii apei din bazin (HC-SR04)
#define pin_trigger 48 // Pin conectare pe placa pentru HC-SR04
#define pin_echo 49 // Pin conectare pe placa pentru HC-SR04
#define VIRTUAL_PIN8 V8 // Pin digital pentru HC-SR04
Ultrasonic ultrasonic(pin_trigger, pin_echo);
//API-ul pentru senzorul de temperatura exterior/presiune atmosferica (BMP180)
Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10180);
bool bmpSensorDetected = true;
// Pin virtual pentru senzorul de temperatura apei (DS18B20).
#define VIRTUAL_PIN1 V1
// Pin conectare pe placa pentru senzorul de temperatura apei (DS18B20).
const int tmpPin = 18;
//API-ul pentru senzorul de temperatura apei (DS18B20)
OneWire oneWire(tmpPin);
DallasTemperature sensors(&oneWire);
// Variabile senzori umiditate sol
int dataread1, dataread2, dataread3, dataread4, dataread5;
int moisturepercent1, moisturepercent2, moisturepercent3, moisturepercent4, moisturepercent5;
#define VIRTUAL_PIN10 V10 // Pin digital senzor pentru umiditatea solului (1).
#define VIRTUAL_PIN11 V11 // Pin digital senzor pentru umiditatea solului (2).
#define VIRTUAL_PIN12 V12 // Pin digital senzor pentru umiditatea solului (3).
#define VIRTUAL_PIN13 V13 // Pin digital senzor pentru umiditatea solului (4).
#define VIRTUAL_PIN14 V14 // Pin digital senzor pentru umiditatea solului (5).
#define sensorpin1 A1 // Pin conectare pe placa pentru senzor umiditate sol (1).
#define sensorpin2 A2 // Pin conectare pe placa pentru senzor umiditate sol (2).
#define sensorpin3 A3 // Pin conectare pe placa pentru senzor umiditate sol (3).
#define sensorpin4 A4 // Pin conectare pe placa pentru senzor umiditate sol (4).
#define sensorpin5 A5 // Pin conectare pe placa pentru senzor umiditate sol (5).
#define sensorpowersupply1 31 // Pin conectare pe placa pentru alimentare senzor umiditate sol (1). ( anti-corodare )
#define sensorpowersupply2 32 // Pin conectare pe placa pentru alimentare senzor umiditate sol (2). ( anti-corodare )
#define sensorpowersupply3 33 // Pin conectare pe placa pentru alimentare senzor umiditate sol (3). ( anti-corodare )
#define sensorpowersupply4 34 // Pin conectare pe placa pentru alimentare senzor umiditate sol (4). ( anti-corodare )
#define sensorpowersupply5 35 // Pin conectare pe placa pentru alimentare senzor umiditate sol (5). ( anti-corodare )
// Variabilele pentru senzorii debit
#define VIRTUAL_PIN22 V22 // Pin digital pentru senzor debit YF-S401 (1).
#define VIRTUAL_PIN23 V23 // Pin digital pentru senzor debit YF-S401 (2).
byte sensorInterrupt = 0;
byte sensorInterrupt1 = 1;
byte sensorPin = 2;
byte sensorPin0 = 3;
float calibrationFactor = 27.3;
float calibrationFactor1 = 27.3;
volatile byte pulseCount;
volatile byte pulseCount1;
float flowRate;
float flowRate1;
unsigned int flowMilliLitres;
unsigned int flowMilliLitres1;
unsigned long totalMilliLitres;
unsigned long totalMilliLitres1;
unsigned long oldTime;
unsigned long oldTime1;
unsigned long read1, read2, read3, read4, read5;
unsigned long pause = 60000;
// Variabile deschidere fereastra
const int stepPin = 11;
const int dirPin = 12;
const int enablePin = 13;
// Variabile deschidere usa
const int stepPin1 = 8;
const int dirPin1 = 9;
const int enablePin1 = 10;
// Variabile ESP8266
#define EspSerial Serial3
ESP8266 wifi(&EspSerial);
void setup()
{
Serial.begin(9600);
Serial.println(“Automatizare Sera - 2020”);
delay(5000);
Serial.println(“Conectare catre serviciul MyDevices.Com”);
pinMode(sensorpowersupply1, OUTPUT);
pinMode(sensorpowersupply2, OUTPUT);
pinMode(sensorpowersupply3, OUTPUT);
pinMode(sensorpowersupply4, OUTPUT);
pinMode(sensorpowersupply5, OUTPUT);
pinMode(RELAY_DIGITAL_PIN1, OUTPUT);
pinMode(RELAY_DIGITAL_PIN2, OUTPUT);
pinMode(RELAY_DIGITAL_PIN26, OUTPUT);
pinMode(RELAY_DIGITAL_PIN27, OUTPUT);
digitalWrite(RELAY_DIGITAL_PIN1, HIGH);
digitalWrite(RELAY_DIGITAL_PIN2, HIGH);
digitalWrite(RELAY_DIGITAL_PIN26, HIGH);
digitalWrite(RELAY_DIGITAL_PIN27, HIGH);
pinMode(sensorPin, INPUT);
pinMode(sensorPin0, INPUT);
digitalWrite(sensorPin, HIGH);
digitalWrite(sensorPin0, HIGH);
pinMode(stepPin,OUTPUT);
pinMode(dirPin,OUTPUT);
pinMode(enablePin,OUTPUT);
pinMode(stepPin1,OUTPUT);
pinMode(dirPin1,OUTPUT);
pinMode(enablePin1,OUTPUT);
digitalWrite(enablePin,HIGH);
digitalWrite(enablePin1,HIGH);
dht1.begin();
dht2.begin();
pulseCount = 0;
flowRate = 0.0;
flowMilliLitres = 0;
totalMilliLitres = 0;
oldTime = 0;
pulseCount1 = 0;
flowRate1 = 0.0;
flowMilliLitres1 = 0;
totalMilliLitres1 = 0;
oldTime1 = 0;
attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
attachInterrupt(sensorInterrupt1, pulseCounter1, FALLING);
float h1 = dht1.readHumidity();
float t1 = dht1.readTemperature();
float h2 = dht2.readHumidity();
float t2 = dht2.readTemperature();
sensors.begin();
EspSerial.begin(115200);
delay(10);
Cayenne.begin(username, password, clientID, wifi, ssid, wifiPassword);
if (!bmp.begin())
{
bmpSensorDetected = false;
}
digitalWrite(sensorpowersupply1, HIGH);
delay(1000);
dataread1 = analogRead(sensorpin1);
moisturepercent1 = map(dataread1, 1023,0,0,100);
digitalWrite(sensorpowersupply1, LOW);
read1 = millis();
digitalWrite(sensorpowersupply2, HIGH);
delay(1000);
dataread2 = analogRead(sensorpin2);
moisturepercent2 = map(dataread2, 1023,0,0,100);
digitalWrite(sensorpowersupply2, LOW);
read2 = millis();
digitalWrite(sensorpowersupply3, HIGH);
delay(1000);
dataread3 = analogRead(sensorpin3);
moisturepercent3 = map(dataread3, 1023,0,0,100);
digitalWrite(sensorpowersupply3, LOW);
read3 = millis();
digitalWrite(sensorpowersupply4, HIGH);
delay(1000);
dataread4 = analogRead(sensorpin4);
moisturepercent4 = map(dataread4, 1023,0,0,100);
digitalWrite(sensorpowersupply4, LOW);
read4 = millis();
digitalWrite(sensorpowersupply5, HIGH);
delay(1000);
dataread5 = analogRead(sensorpin5);
moisturepercent5 = map(dataread5, 1023,0,0,100);
digitalWrite(sensorpowersupply5, LOW);
read5 = millis();
}
void loop()
{
Cayenne.loop();
if((millis() - oldTime) > 1000)
{
detachInterrupt(sensorInterrupt);
flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
oldTime = millis();
flowMilliLitres = (flowRate / 60) * 1000;
totalMilliLitres += flowMilliLitres;
unsigned int frac;
frac = (flowRate - int(flowRate)) * 10;
pulseCount = 0;
attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
}
if((millis() - oldTime1) > 1000)
{
detachInterrupt(sensorInterrupt1);
flowRate1 = ((1000.0 / (millis() - oldTime1)) * pulseCount1) / calibrationFactor1;
oldTime1 = millis();
flowMilliLitres1 = (flowRate1 / 60) * 1000;
totalMilliLitres1 += flowMilliLitres1;
unsigned int frac1;
frac1 = (flowRate1 - int(flowRate1)) * 10;
pulseCount1 = 0;
attachInterrupt(sensorInterrupt1, pulseCounter1, FALLING);
}
if (millis() - lastMillis > 60000) {
float h1 = dht1.readHumidity();
float t1 = dht1.readTemperature();
float h2 = dht2.readHumidity();
float t2 = dht2.readTemperature();
if (isnan(h1) || isnan(t1)) {
return;
}
if (isnan(h2) || isnan(t2)) {
return;
}
Cayenne.celsiusWrite(16, t1);
Cayenne.virtualWrite(17, h1);
lastMillis = millis();
Cayenne.celsiusWrite(18, t2);
Cayenne.virtualWrite(19, h2);
lastMillis = millis();
}
}
void pulseCounter()
{
pulseCount++;
}
void pulseCounter1()
{
pulseCount1++;
}
// Senzorul DS18B20
CAYENNE_OUT(VIRTUAL_PIN1)
{
sensors.requestTemperatures();
Cayenne.celsiusWrite(VIRTUAL_PIN1, sensors.getTempCByIndex(0));
delay(500);
}
// Releu Pornire Pompa1
CAYENNE_IN(V4)
{
int currentValue = getValue.asInt();
if (currentValue == 0) {
digitalWrite(RELAY_DIGITAL_PIN1, HIGH);
} else {
digitalWrite(RELAY_DIGITAL_PIN1, LOW);
}
}
// Releu Pornire Pompa2
CAYENNE_IN(V5)
{
int currentValue = getValue.asInt();
if (currentValue == 0) {
digitalWrite(RELAY_DIGITAL_PIN2, HIGH);
} else {
digitalWrite(RELAY_DIGITAL_PIN2, LOW);
}
}
// Releu Aprindere Lumina
CAYENNE_IN(V26)
{
int currentValue = getValue.asInt();
if (currentValue == 0) {
digitalWrite(RELAY_DIGITAL_PIN26, HIGH);
} else {
digitalWrite(RELAY_DIGITAL_PIN26, LOW);
}
}
// Releu Ventilatie
CAYENNE_IN(V27)
{
int currentValue = getValue.asInt();
if (currentValue == 0) {
digitalWrite(RELAY_DIGITAL_PIN27, HIGH);
} else {
digitalWrite(RELAY_DIGITAL_PIN27, LOW);
}
}
// Senzor presiune atmosferica BMP180
CAYENNE_OUT(VIRTUAL_PIN2)
{
if (bmpSensorDetected)
{
sensors_event_t event;
bmp.getEvent(&event);
if (event.pressure)
{
Cayenne.hectoPascalWrite(VIRTUAL_PIN2, event.pressure);
}
}
}
// Senzor Temperatura Exterior BMP180
CAYENNE_OUT(VIRTUAL_PIN3)
{
if (bmpSensorDetected)
{
float temperature;
bmp.getTemperature(&temperature);
Cayenne.celsiusWrite(VIRTUAL_PIN3, temperature);
}
}
// Senzor Nivel Apa In Bazin HC-SR04
CAYENNE_OUT(VIRTUAL_PIN8)
{
float cmMsec;
long microsec = ultrasonic.timing();
cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
Cayenne.virtualWrite(V8, cmMsec, “prox”,“cm”);
}
// Senzor Umiditate Sol 1
CAYENNE_OUT(VIRTUAL_PIN10)
{
if((millis() - read1) > pause)
{
digitalWrite(sensorpowersupply1, HIGH);
delay(1000);
dataread1 = analogRead(sensorpin1);
moisturepercent1 = map(dataread1, 1023,0,0,100);
digitalWrite(sensorpowersupply1, LOW);
read1 = millis();
}
Cayenne.virtualWrite(V10, moisturepercent1, “soil_moist”, “p”);
}
// Senzor Umiditate Sol 2
CAYENNE_OUT(VIRTUAL_PIN11)
{
if((millis() - read2) > pause)
{
digitalWrite(sensorpowersupply2, HIGH);
delay(1000);
dataread2 = analogRead(sensorpin2);
moisturepercent2 = map(dataread2, 1023,0,0,100);
digitalWrite(sensorpowersupply2, LOW);
read2 = millis();
}
Cayenne.virtualWrite(V11, moisturepercent2, “soil_moist”, “p”);
}
// Senzor Umiditate Sol 3
CAYENNE_OUT(VIRTUAL_PIN12)
{
if((millis() - read3) > pause)
{
digitalWrite(sensorpowersupply3, HIGH);
delay(1000);
dataread3 = analogRead(sensorpin3);
moisturepercent3 = map(dataread3, 1023,0,0,100);
digitalWrite(sensorpowersupply3, LOW);
read3 = millis();
}
Cayenne.virtualWrite(V12, moisturepercent3, “soil_moist”, “p”);
}
// Senzor Umiditate Sol 4
CAYENNE_OUT(VIRTUAL_PIN13)
{
if((millis() - read4) > pause)
{
digitalWrite(sensorpowersupply4, HIGH);
delay(1000);
dataread4 = analogRead(sensorpin4);
moisturepercent4 = map(dataread4, 1023,0,0,100);
digitalWrite(sensorpowersupply4, LOW);
read4 = millis();
}
Cayenne.virtualWrite(V13, moisturepercent4, “soil_moist”, “p”);
}
// Senzor Umiditate Sol 5
CAYENNE_OUT(VIRTUAL_PIN14)
{
if((millis() - read5) > pause)
{
digitalWrite(sensorpowersupply5, HIGH);
delay(1000);
dataread5 = analogRead(sensorpin5);
moisturepercent5 = map(dataread5, 1023,0,0,100);
digitalWrite(sensorpowersupply5, LOW);
read5 = millis();
}
Cayenne.virtualWrite(V14, moisturepercent5, “soil_moist”, “p”);
}
// Senzor debit YF-S401
CAYENNE_OUT(VIRTUAL_PIN22)
{
Cayenne.virtualWrite(V22, totalMilliLitres1, “liquid”, “l” );
}
// Senzor debit YF-S401
CAYENNE_OUT(VIRTUAL_PIN23)
{
Cayenne.virtualWrite(V23, totalMilliLitres, “liquid”, “l” );
}
// Senzor Temperatura & Umiditate In Sera DHT21/AM2301
CAYENNE_OUT(VIRTUAL_PIN6)
{
float h1 = dht1.readHumidity();
float t1 = dht1.readTemperature();
Cayenne.celsiusWrite(16, t1);
Cayenne.virtualWrite(17, h1, “rel_hum”, “p”);
}
// Senzor Temperatura & Umiditate Exterior DHT21/AM2301
CAYENNE_OUT(VIRTUAL_PIN7)
{
float h2 = dht2.readHumidity();
float t2 = dht2.readTemperature();
Cayenne.celsiusWrite(18, t2);
Cayenne.virtualWrite(19, h2, “rel_hum”, “p”);
}
CAYENNE_IN(20)
{
int x = getValue.asInt();
if (x == 1){
digitalWrite(enablePin,LOW);
digitalWrite(dirPin,LOW);
for(int x = 1; x < 4000; x++) {
digitalWrite(stepPin,HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin,LOW);
delayMicroseconds(1000);
}
digitalWrite(enablePin,HIGH);
}
}
CAYENNE_IN(21)
{
int x = getValue.asInt();
if (x == 1){
digitalWrite(enablePin,LOW);
digitalWrite(dirPin,HIGH);
for(int x = 1; x < 4000; x++) {
digitalWrite(stepPin,HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin,LOW);
delayMicroseconds(1000);
}
digitalWrite(enablePin,HIGH);
}
}
CAYENNE_IN(24)
{
int x = getValue.asInt();
if (x == 1){
digitalWrite(enablePin1,LOW);
digitalWrite(dirPin1,LOW);
for(int x = 1; x < 4000; x++) {
digitalWrite(stepPin1,HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin1,LOW);
delayMicroseconds(1000);
}
digitalWrite(enablePin1,HIGH);
}
}
CAYENNE_IN(25)
{
int x = getValue.asInt();
if (x == 1){
digitalWrite(enablePin1,LOW);
digitalWrite(dirPin1,HIGH);
for(int x = 1; x < 4000; x++) {
digitalWrite(stepPin1,HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin1,LOW);
delayMicroseconds(1000);
}
digitalWrite(enablePin1,HIGH);
}
}