//Wifi
#define BLYNK_TEMPLATE_ID "TMPL4LJ6KqmCD"
#define BLYNK_TEMPLATE_NAME "Smart Greenhouse"
#define BLYNK_AUTH_TOKEN "JVbbyeYrQF9FJ853YnhDwQoFu2uWpTpR"
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST"; //nama hotspot yang digunakan
char pass[] = ""; //password hotspot yang digunakan
//Library από το Humidity Sensor
#include <DHT.h>
#define DHTPIN 33 // Mention the digital pin where you connected
#define DHTTYPE DHT22 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
//Blynk
BlynkTimer timer;
// pin Photoresistor
#define LDR_PIN 32
// LDR Characteristics
const float GAMMA = 0.7;
const float RL10 = 50;
//PIR Sensor
int ledPin = 18;
int PIR = 13;
int pirState = LOW; // Ξεκινάμε με το LOW διότι θεωρούμε ότι δεν υπάρχει κίνηση
int val = 0;
// Servo Motor
#include <ESP32Servo.h>
static const int servoPin = 14;
Servo servo;
static const int servoPin2 = 21;
Servo myServo;
//Stepper Motor
#include <Stepper.h>
const int stepsPerRevolution = 2000;
Stepper myStepper(stepsPerRevolution, 23, 27, 26, 25);
void setup() {
Serial.begin(115200);
//Wifi
Blynk.begin(auth, ssid, pass);
dht.begin();
timer.setInterval(2500L, sendSensor);
pinMode(LDR_PIN , INPUT);
pinMode(PIR, INPUT);
pinMode(servoPin, INPUT);
pinMode(servoPin2, INPUT);
pinMode(ledPin, OUTPUT);
//Servo Motor
servo.attach(servoPin, 500, 2400);
myServo.attach(servoPin2, 500, 2400);
// Stepper Motor
myStepper.setSpeed(60);
}
int pos1 = 90;
int pos2 = 45;
void loop() {
Blynk.run();
timer.run();
}
void sendSensor(){
//Humidity Sensor
float humidity = dht.readHumidity();
float temp = dht.readTemperature(); //Διαβάζει την θερμοκρασία σε βαθμούς Κελσίου
if (isnan(humidity) || isnan(temp)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Blynk.virtualWrite(V0, temp);
Blynk.virtualWrite(V1, humidity);
Serial.print("Θερμοκήπιο: ");
Serial.print("Θερμοκρασία : ");
Serial.print(temp);
Serial.print(" Υγρασία : ");
Serial.print(humidity);
if(temp > 30){
Blynk.logEvent("temp_alert","Temp above 30 degrees");
}
//LDR Sensor
int analogValue = analogRead(LDR_PIN);
analogValue = map(analogValue, 4095, 0, 1024, 0);
float voltage = analogValue / 1024. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
if (lux > 160){
Serial.print(" Μέρα ");
}else{
Serial.print(" Νύχτα ");
}
Serial.print(" Lux: ");
Serial.println(lux);
Blynk.virtualWrite(V2, lux);
//PIR Sensor
val = digitalRead(PIR); // Διαβάζει input τιμές
if (val == HIGH) { // Ελέγχει αν το Input είναι HIGH
digitalWrite(ledPin, HIGH); // Ανοίγει το LED
if (pirState == LOW) {
Serial.println("Ανιχνεύθηκε κίνηση!");
pirState = HIGH;
}
} else {
digitalWrite(ledPin, LOW); // Κλείνει το LED
if (pirState == HIGH) {
Serial.println("H κίνηση σταμάτησε!");
pirState = LOW;
}
Blynk.virtualWrite(V3, PIR);
}
//Servo Motor
if (humidity<=40){
servo.write(pos1);
}else{
servo.write(-pos1);
}
//Blynk.virtualWrite(V4, servo);Εδώ νομίζω φταίει που η μεταβλητή servo δεν είναι ο σωστός τύπος πρέπει ή να το αλλάξεις από το blynk τον τύπο της μεταβλητής ή από εδώ να το αλλάξουμε για να ταιριάζει στο blynk
//Stepper Motor
if(temp >= 29.00 || humidity>75){
myStepper.step(stepsPerRevolution);
myServo.write(pos2);
//Serial.println("Ο ανεμιστήρας είναι ενεργοποιημένος");
}
else{
//stepper.setAcceleration(0);
myStepper.step(stepsPerRevolution*0);
myServo.write(pos2+90);
// Serial.println("Ο ανεμιστήρας είναι απενεργοποιημένος");
}/*
Blynk.virtualWrite(V5, myStepper);Το ίδιο και δω νομίζω
if(myStepper==LOW && temp>40){
Blynk.logEvent("fan","O ανεμιστήρας έχει χαλάσει και ο χώρος δεν ψύχετε");
} */
}