#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <DHTesp.h>
#include <ESP32Servo.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <freertos/semphr.h>
//Define or make parameter
//---------------------------------------------------------------------
DHTesp DHT;
Servo myServo; // Create a Servo object
const int servoPin = 16;
const int doorbell = 19;
const int AC = 17;
const int Heater = 5;
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH,
SCREEN_HEIGHT, &Wire, OLED_RESET);
SemaphoreHandle_t i2cMutex = xSemaphoreCreateMutex();
//Taskbar and Define hardware
//---------------------------------------------------------------------
void lighting( void *pvParameters );
void TemHum( void *pvParameters );
void Security( void *pvParameters );
void Disaster( void *pvParameters );
//void setup
//---------------------------------------------------------------------
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Hello, ESP32!");
xTaskCreate(lighting, "task1",4098,NULL,1,NULL);
xTaskCreate(Security, "task3",2048,NULL,5,NULL);
xTaskCreate(TemHum, "task2",2048,NULL,3,NULL);
// xTaskCreate(Disaster, "task4",4098,NULL,4,NULL);
\
ESP32PWM::allocateTimer(0); // Dedicated timer for servo
myServo.setPeriodHertz(50);
myServo.attach(servoPin, 500, 2500);
myServo.attach(servoPin);
pinMode(doorbell, INPUT_PULLUP);
DHT.setup(23, DHTesp::DHT22);
pinMode(AC, OUTPUT);
pinMode(Heater, OUTPUT);
ww
}
//void loop
//---------------------------------------------------------------------
void loop() {
}
//Task1 lighting
//---------------------------------------------------------------------
void lighting(void *pvParameters) {
int ledPin = 32;
int pir1Pin = 34;
int pirStat = 0;
pinMode(ledPin, OUTPUT);
pinMode(pir1Pin, INPUT);
Serial.println("Task1");
while(1)
{
pirStat = digitalRead(pir1Pin);
if (pirStat == HIGH) {
digitalWrite(ledPin, HIGH);
Serial.println("Lights on");
vTaskDelay( 5000 / portTICK_PERIOD_MS );
Serial.println("Lights off");}
else {digitalWrite(ledPin, LOW);}
}
}
//Task2 Tem&Hum
//---------------------------------------------------------------------
void TemHum(void *pvParameters) {
while(1) {
TempAndHumidity data = DHT.getTempAndHumidity(); // Non-blocking!
Serial.printf("Temp: %.1f°C, Hum: %.1f%%\n", data.temperature, data.humidity);
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
}
//Task3 Security
//---------------------------------------------------------------------
void Security(void *pvParameters) {
Serial.println("Task3");
while (1) {
int doorkey = digitalRead(doorbell);
if(doorkey == LOW)
{ myServo.write(0); // 0° closed door
vTaskDelay(1000 / portTICK_PERIOD_MS);
myServo.write(90); // 90° opened door
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
}
//Task4 Disaster
//---------------------------------------------------------------------
void Disaster(void *pvParameters) {
//pinMode(, );
while(1)
{
Serial.println("Task4");
digitalWrite(8, HIGH);
vTaskDelay( 200 / portTICK_PERIOD_MS );
digitalWrite(8, LOW);
vTaskDelay( 200 / portTICK_PERIOD_MS );
}
}
//---------------------------------------------------------------------