// oled screen
#include <Tiny4kOLED.h>
// SD card
#include <SD.h>
#define CS_PIN 9 // sd card pin
File root;
// temp & humidity sensor
#include <dht.h>
#define DHT22_PIN 2
dht DHT;
// Light sensor Characteristics
const float GAMMA = 0.7;
const float RL10 = 50;
// Clock
#include "RTClib.h"
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
// Soil moisture sensor
const int soil_pin = A1;
//led
int water_led = 4;
int light_led = 3;
// relay modules
const int relay_water = 7; // water pump
const int relay_light = 8; // light bulb
//@@@@@@@@@@@@@@@@@@@@@@@@@@@
// parameters -----
int update_time = int(30 *1000); // update loop time in ms
int cont1 = 0;
int soil_data_save_rate = 40; // number of loops before saving data
// it corresponds to 20min since 20min* 60sec/min =1200 sec / 30sec/loop =40 loop
void setup() {
oled.begin(128, 64, sizeof(tiny4koled_init_128x64br), tiny4koled_init_128x64br);
oled.setFont(FONT6X8); // Two fonts are supplied with this library, FONT8X16 and FONT6X8
oled.clear();
oled.on();
rtc.begin();
SD.begin(CS_PIN);
pinMode(water_led, OUTPUT);
pinMode(light_led, OUTPUT);
pinMode(relay_water, OUTPUT);
pinMode(relay_light, OUTPUT);
}
void loop() {
oled.clear();
digitalWrite(water_led, LOW);
digitalWrite(light_led, LOW);
// Temp & Humidity sensor ==================
int chk = DHT.read22(DHT22_PIN);
oled.setCursor(1, 10);
oled.print(F("Room Temp.: "));
oled.print(DHT.temperature, 1);
oled.println(" C");
oled.setCursor(1,11);
oled.print(F("Room Humidity: "));
oled.print(DHT.humidity, 1);
oled.println(" %");
// Light sensor ============================
int analog_light_read = analogRead(A0);
float voltage = analog_light_read / 1024. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
oled.setCursor(1,12);
oled.print("Room Light: ");
if (lux > 50) {
oled.print("-ok-");
digitalWrite(relay_light,LOW); // deactivate light
} else {
oled.print("Dark ");
digitalWrite(light_led, HIGH); // turn light alert led on
digitalWrite(relay_light,HIGH); // activate light
}
// Clock ============================
DateTime now = rtc.now();
oled.setCursor(1, 8);
oled.print(now.month(), DEC);
oled.print('/');
oled.print(now.day(), DEC);
oled.print(' ');
oled.print(daysOfTheWeek[now.dayOfTheWeek()]);
oled.print(' ');
oled.print(now.hour(), DEC);
oled.print(':');
oled.print(now.minute(), DEC);
// oled.print(':');
// oled.print(now.second(), DEC);
// Soil moisture =================
float soil_H = analogRead(soil_pin)/10; // value 0-1000 convert to %
oled.setCursor(1,14);
oled.print("Soil moist.:");
oled.print(soil_H);
oled.print(" %");
if(soil_H<30){
digitalWrite(water_led, HIGH); // turn water alert led on
digitalWrite(relay_water,HIGH); // activate water pump for 5sec
delay(5000);
digitalWrite(relay_water,LOW); // deactivate water
}
//--- saving data on soil moist to SD
if(cont1==soil_data_save_rate){
File data_soil = SD.open("soil_moist_data.txt", FILE_WRITE);
if (data_soil) {
data_soil.print(now.hour());data_soil.print("\t");
data_soil.print(now.minute());data_soil.print("\t");
data_soil.print(soil_H);
data_soil.close();
cont1=0;
}}
cont1 += 1;
//=============================================
delay(update_time);
}