ESP32 veri çekme sorunu

selindb

Yeni Üye
Katılım
8 Ocak 2025
Mesajlar
1
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:
Foruma hoş geldin. Program kodunu "Kod" bloğu olarak eklersen, program daha anlaşılır olur. Ama mevcut mesajdan alıp tekrar ekleme, böyle yaparsan aralara boş satırlar ekleniyor. Onun yerine orijinal program kodudu Arduino IDE'den tekrar al ve "Kod" olarak ekle.

1736351345615.png
 
http kütüphanesinin DNS çözümleme yaptığından emin misin? İstersen doğrudan IP adres yazarak dene bakalım fark olacak mı. Doğru IP adresi amazonaws console'dan öğrenebilirsin.

C++:
//String serverIP = ".........eu-north-1.compute.amazonaws.com:80";
String serverIP = "123.123.123.123:80";
 
Gözüme çarpan husular.

Ardunio idesi nasıl yorumlar bilemiyorum ama unsigned long tipindeki bir değişkene değer ataması yapılırken float tipinde bir değer artimetik işleme dahil ediliyor. Bu durumda normal c derleyicinin en azından warning üretmesi gerekir.

Önerim cast işlemi uygulayın.

C:
sulamaAraligi = 3.5 * 24UL * 60UL * 60UL * 1000UL; // Yarım hafta


Diğer bir husus irrigationAmount değeri paylaştığınız kodun herhangi bir yerinde tanımlanmadı ayrıca içeriği doldurulmuyor.

C:
  if (sulamaAraligi > 0 && millis() - sonSulamaZamani >= sulamaAraligi) {
    sulamaYap(irrigationAmount);
  }
 
Son düzenleme:
İlave sulamaBilgisiAl(....); fonksiyon içerisinde else lerde tanımlı hata mesajları var. Buraları kotrol ettiniz mi? Problem oluştuğunda hangi mesajı print ediyor.
 
Yaşadığınız problem ile bir alakası yok ama pinMode ayarladığınız kısımları wifiBegin üzerine almanız doğru bir tercih olur.
Wifi bağlantı işlemleri uzun sürebilir bu sırada motor sürücüsünü kontrol eden pinlerin durumları "belirsiz" dir.

C:
  pinMode(MOTOR_IN1, OUTPUT);
  pinMode(MOTOR_IN2, OUTPUT);
  pinMode(MOTOR_ENA, OUTPUT);

  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, LOW);
  analogWrite(MOTOR_ENA, 0);
 

Forum istatistikleri

Konular
7,181
Mesajlar
121,886
Üyeler
2,906
Son üye
Rebi

Son kaynaklar

Son profil mesajları

Freemont2.0 wrote on herbokolog's profile.
nick iniz yakıyor
:D
Freemont2.0 wrote on posta's profile.
Merhabalar :)
az bilgili çok meraklı
Prooffy wrote on semih_s's profile.
Merhaba, sizden DSO2C10 hakkında bilgi rica ettim. Yanıtlarsanız sevinirim...
Unal wrote on taydin's profile.
Timur Bey, Arduino kontrollü bir akü şarj cihazı yapmaya çalışıyorum. Aklımdaki fikri basit bir çizim olarak konu açmıştım. Özellikle sizin fikirlerinizi çok önemsiyorum.
Back
Top