Merhaba Esp32 ile yaptığım bir projem var. AWS de bulunan database den sulama verisi çekiyorum daha sonra çektiğim sulama verisine göre su pompasını çalıştırıyorum ardından da dht11 ve toprak nem sensöründen aldığım verilerimi veritabanına iletiyorum. Veri yollama kısmında hiç bir problemim yok fakat veri çekme ve su pompasını çalıştırma kısmı kararlı bir şekilde çalışmıyor. Bazen çalışıyor bazen ise veriyi çekemiyor ve sulama da yapamıyor. Kodlarım da şu şekilde
C:
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <DHT.h>
// Wi-Fi Ayarları
const char* ssid = "........";
const char* password = " ";
// Kullanıcı Tarafından Belirlenen Sunucu IP'si
String serverIP = ".........eu-north-1.compute.amazonaws.com:80";
bool useDynamicIP = false; // Eğer dinamik IP kullanılacaksa bunu true yapın
// DHT Ayarları
#define DHTPIN 26
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// Toprak Nemi Sensörü
#define SOIL_MOISTURE_PIN 14
// Motor Sürücü Pinleri (L298N veya benzeri için)
#define MOTOR_IN1 32
#define MOTOR_IN2 33
#define MOTOR_ENA 25 // PWM kontrolü için
String sensorSerialNumber = "qwe"; // Örnek seri numarası
// Sulama Bilgisi
int irrigationAmount = 0; // Sulama miktarı (ml)
int wateringFrequency = 0; // Haftada sulama sayısı
unsigned long sulamaAraligi = 0; // Sulama aralığı (milisaniye)
unsigned long sonSulamaZamani = 0; // Son sulama zamanı
// Dinamik veya Sabit Sunucu IP'sine Göre Base URL Oluştur
String getBaseURL() {
if (useDynamicIP) {
String dynamicIP = WiFi.localIP().toString();
return "http://" + dynamicIP + "/api";
} else {
return "http://" + serverIP + "/api";
}
}
// Fonksiyon: Sulama İşlemini Yap
void sulamaYap(int miktar) {
if (miktar > 0) {
Serial.println("Sulama işlemi başlatıldı!");
Serial.print(miktar);
Serial.println(" ml sulama yapılıyor...");
// Sulama miktarına göre çalışma süresini hesapla
unsigned long calismaSuresi = miktar * 80; // 1 ml için 80 ms
digitalWrite(MOTOR_IN1, HIGH);
digitalWrite(MOTOR_IN2, LOW);
analogWrite(MOTOR_ENA, 100);
delay(calismaSuresi); // Çalışma süresine göre bekle
digitalWrite(MOTOR_IN1, LOW);
digitalWrite(MOTOR_IN2, LOW);
analogWrite(MOTOR_ENA, 0);
Serial.println("Sulama işlemi tamamlandı!");
sonSulamaZamani = millis(); // Sulama zamanı güncelleniyor
} else {
Serial.println("Sulama miktarı geçersiz, işlem yapılmadı.");
}
}
// Fonksiyon: Sunucudan Sulama Bilgilerini Al
void sulamaBilgisiAl(String sensorSerialNumber) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String serverNameGet = getBaseURL() + "/Plant/PlantBySensorSerialNumber/" + sensorSerialNumber;
http.begin(serverNameGet);
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
String payload = http.getString();
Serial.println("Gelen Sulama Bilgisi: " + payload);
StaticJsonDocument<256> jsonDoc;
DeserializationError error = deserializeJson(jsonDoc, payload);
if (!error) {
irrigationAmount = jsonDoc["irrigationAmount"];
wateringFrequency = jsonDoc["wateringFrequency"];
if (wateringFrequency == 1) {
sulamaAraligi = 7UL * 24UL * 60UL * 60UL * 1000UL; // Haftada bir
} else if (wateringFrequency == 2) {
sulamaAraligi = 3.5 * 24UL * 60UL * 60UL * 1000UL; // Yarım hafta
} else {
sulamaAraligi = 0; // Geçersiz değer
}
Serial.print("Sulama Aralığı (ms): ");
Serial.println(sulamaAraligi);
// Sulama bilgileri başarıyla alındıktan sonra sulamayı başlat
// sulamaYap(irrigationAmount);
} else {
Serial.println("Sulama bilgisi JSON ayrıştırma hatası!");
}
} else {
Serial.print("Sulama bilgisi alınamadı. HTTP Hatası: ");
Serial.println(httpResponseCode);
}
http.end();
} else {
Serial.println("Wi-Fi bağlantısı yok, sulama bilgisi alınamıyor.");
}
}
// Fonksiyon: Sensör Verilerini Sunucuya Gönder
void veriGonder(int toprakNem, int havaNem, int sicaklik, String sensorSerialNumber) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String serverNamePost = getBaseURL() + "/SensorDataLog/AddSensorDataLog";
http.begin(serverNamePost);
StaticJsonDocument<1024> jsonDoc;
jsonDoc["sensorSerialNumber"] = sensorSerialNumber;
jsonDoc["temperature"] = sicaklik;
jsonDoc["moisture"] = havaNem;
jsonDoc["soilMoisture"] = toprakNem;
String jsonData;
serializeJson(jsonDoc, jsonData);
Serial.println("Gönderilen JSON Verisi: " + jsonData);
http.addHeader("Content-Type", "application/json");
int httpResponseCode = http.POST(jsonData);
if (httpResponseCode > 0) {
Serial.print("Veriler başarıyla gönderildi. HTTP Cevap Kodu: ");
Serial.println(httpResponseCode);
} else {
Serial.print("Veri gönderim hatası: ");
Serial.println(httpResponseCode);
}
http.end();
} else {
Serial.println("Wi-Fi bağlantısı yok, veri gönderilemiyor.");
}
}
void setup() {
Serial.begin(115200);
Serial.println("Sistem Başlatılıyor...");
dht.begin();
WiFi.begin(ssid, password);
Serial.print("Wi-Fi'ye bağlanıyor");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWi-Fi bağlantısı başarılı!");
Serial.print("IP Adresi: ");
Serial.println(WiFi.localIP());
pinMode(MOTOR_IN1, OUTPUT);
pinMode(MOTOR_IN2, OUTPUT);
pinMode(MOTOR_ENA, OUTPUT);
digitalWrite(MOTOR_IN1, LOW);
digitalWrite(MOTOR_IN2, LOW);
analogWrite(MOTOR_ENA, 0);
sulamaBilgisiAl(sensorSerialNumber);
}
void loop() {
int temperature = dht.readTemperature();
int humidity = dht.readHumidity();
int soilMoisturePercentage = 100.0;
if (isnan(temperature) || isnan(humidity)) {
Serial.println("DHT11 Verileri Alınamıyor! Bağlantıları kontrol edin.");
} else {
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.print(" °C Humidity: ");
Serial.print(humidity);
Serial.println(" %");
Serial.print("Toprak Nem Seviyesi (%): ");
Serial.print(soilMoisturePercentage);
Serial.println(" %");
veriGonder(soilMoisturePercentage, humidity, temperature, sensorSerialNumber);
}
if (sulamaAraligi > 0 && millis() - sonSulamaZamani >= sulamaAraligi) {
sulamaYap(irrigationAmount);
}
delay(10000); // 10 saniyede bir döngü
}
Son düzenleme: