#include <WiFi.h>
#include <HTTPClient.h>
#include <DHTesp.h>
#include "ArduinoJson.h"
// Pin Definitions
#define LED_PIN 32
#define DHT_PIN 15
#define PIR_SENSOR 12
// WiFi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Server URL
String serverPostUrl = "https://postman-echo.com/post";
// Objects
DHTesp dhtSensor;
// Variables
float temperature = 0.0;
float humidity = 0.0;
int motion = 0;
// // Task Handles
// TaskHandle_t blinkTaskHandle;
// TaskHandle_t sensorTaskHandle;
// TaskHandle_t sendTaskHandle;
// Function Prototypes
void blinkTask(void* parameter);
void sensorTask(void* parameter);
void sendTask(void* parameter);
void setup() {
Serial.begin(9600);
// WiFi connection
Serial.print("Connecting to WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println("\nWiFi Connected!");
// Pin configurations
pinMode(LED_PIN, OUTPUT);
pinMode(PIR_SENSOR, INPUT);
// Initialize DHT sensor
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
// Create FreeRTOS tasks
xTaskCreate(blinkTask, "Blink LED", 1024, NULL, 1, NULL);
xTaskCreate(sensorTask, "Read Sensors", 2048, NULL, 1, NULL);
xTaskCreate(sendTask, "Send Data", 8192, NULL, 1, NULL);
}
void loop() {
// Empty, FreeRTOS handles the tasks
}
void blinkTask(void* parameter) {
for(;;){ // infinite loop
// Turn the LED on
digitalWrite(LED_PIN, HIGH);
// Pause the task for 500ms
vTaskDelay(500 / portTICK_PERIOD_MS);
// Turn the LED off
digitalWrite(LED_PIN, LOW);
// Pause the task again for 500ms
vTaskDelay(500 / portTICK_PERIOD_MS);
// Serial.println("LED is blinking ...");
}
}
void sensorTask(void* parameter) {
for(;;) {
TempAndHumidity data = dhtSensor.getTempAndHumidity();
temperature = data.temperature;
humidity = data.humidity;
// Read motion sensor
motion = digitalRead(PIR_SENSOR);
if (motion == HIGH) {
Serial.println("Motion detected");
} else {
Serial.println("No motion");
}
// Log sensor values
Serial.println("Temperature: " + String(temperature) + "°C");
Serial.println("Humidity: " + String(humidity) + "%");
Serial.println("---");
vTaskDelay(2000 / portTICK_PERIOD_MS); // Update every 2 seconds
}
}
void sendTask(void* parameter) {
for(;;) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(serverPostUrl);
http.addHeader("Content-Type", "application/json");
// Create JSON object
DynamicJsonDocument doc(1024);
String jsonStr;
doc["temperature"] = temperature;
doc["humidity"] = humidity;
doc["motion"] = motion;
serializeJson(doc, jsonStr);
// Send POST request
int httpResponseCode = http.POST(jsonStr);
if (httpResponseCode > 0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
String payload = http.getString();
Serial.println("Response:");
Serial.println(payload);
} else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
http.end();
} else {
Serial.println("WiFi Disconnected");
}
vTaskDelay(5000 / portTICK_PERIOD_MS); // Send data every 5 seconds
}
}