#include <Arduino.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>

#define DHTPIN 22
#define DHTTYPE DHT22
#define LDR_AO_PIN 34  // Analog Output pin of LDR module
#define LDR_DO_PIN 35  // Digital Output pin of LDR module (optional)

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(115200);
  
  // Initialize the DHT sensor
  Serial.println("DHT22 test!");
  dht.begin();

  // Initialize the LDR pins
  pinMode(LDR_AO_PIN, INPUT);
  pinMode(LDR_DO_PIN, INPUT);  // Optional, if using the digital output

  // Create FreeRTOS tasks
  xTaskCreatePinnedToCore(readTemperature, "Read Temperature", 2048, NULL, 1, NULL, 1); // Increase stack size
  xTaskCreatePinnedToCore(readLightIntensity, "Read Light Intensity", 1024, NULL, 1, NULL, 1);
}

void loop() {
  // Do nothing here
}

void readTemperature(void * parameter) {
  for (;;) {
    float h = dht.readHumidity();
    float t = dht.readTemperature();
    if (!isnan(h) && !isnan(t)) {
      Serial.print("Humidity: ");
      Serial.print(h);
      Serial.print(" %\t");
      Serial.print("Temperature: ");
      Serial.print(t);
      Serial.println(" *C ");
    } else {
      Serial.println("Failed to read from DHT sensor!");
    }
    vTaskDelay(2000 / portTICK_PERIOD_MS);
  }
}

void readLightIntensity(void * parameter) {
  for (;;) {
    int ldrValue = analogRead(LDR_AO_PIN);
    Serial.print("Light Intensity: ");
    Serial.println(ldrValue);
    
    int ldrDigitalValue = digitalRead(LDR_DO_PIN);  // Optional, if using the digital output
    Serial.print("Digital Light Intensity: ");
    Serial.println(ldrDigitalValue);

    vTaskDelay(2000 / portTICK_PERIOD_MS);
  }
}