#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include <SPI.h>
#include <SD.h>
//OLED
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#define OLED_WIDTH 128
#define OLED_HEIGHT 64
#define OLED_ADDR 0x3C //CONFIRM addr
//DHT22
#include <DHT.h>
//LDR
#define LDR_PIN 4
//includes and defines for HC-SR50 PIR Motion Sensor
#define Pir_PIN 26
int motionStatus = 0;
//SD CARD
#include <SD.h>
#define CS_PIN 5
File root;
//Objects OLED and DHT
Adafruit_SSD1306 display(OLED_WIDTH,OLED_HEIGHT);
DHT dht(25,DHT22);
void setup() {
Serial.begin(9600);
//initializing SD CARD
Serial.print("Initializing SD card... ");
if (!SD.begin(CS_PIN)) {
Serial.println("Card initialization failed!");
while (true);
}
Serial.println("initialization done.");
Serial.println("Files in the card:");
root = SD.open("/");
printDirectory(root, 0);
Serial.println("");
//initializing Pir Motion Sensor
pinMode(Pir_PIN, INPUT);//initializing Pir Motion Sensor
//initializing OLED
delay(1250); // wait for the OLED to power up
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
Serial.println(F("SH1107 connected"));
display.clearDisplay();
delay(1000); //delay 1s
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("DTSD 1st project");
display.display();
delay(5000); //delay 5s
display.clearDisplay();
dht.begin();
} //void setup
void loop(){
float temp = dht.readTemperature();
float humidity = dht.readHumidity();
int luminosity = analogRead(LDR_PIN);
//Serial.print("Temperature: ");
//Serial.print(temp);
//Serial.print(" ºC");
//Serial.print(" Humidity: ");
//Serial.print(humidity);
//Serial.print(" %");
//Serial.print(" Luminosity: ");
//Serial.print(luminosity);
//Serial.println(" lux");
//Motion Sensor
motionStatus = digitalRead(Pir_PIN);
if (motionStatus == HIGH){
Serial.println("Motion Detected");
display.println("Movement!!!");
display.display();
//writing the message for the memory card
//Temperature
String message;
message.reserve(200);
message = "Temperature: ";
message += temp;
message += " ºC";
//Humidity
message += " Humidity: ";
message += humidity;
message += " %";
//Luminosity
message += " Luminosity: ";
message += luminosity;
message += " lux";
message += "\n";
//appending the results to a file
appendFile("/measure_files.txt", message);
// Example of reading file from the card:
File textFile = SD.open("/measure_files.txt");
if (textFile) {
while (textFile.available()) {
Serial.write(textFile.read());
}
textFile.close();
} else {
Serial.println("error opening measure_files.txt!");
}
//writing Temperature to Oled
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print("Temperature: ");
display.print(temp);
display.println(" degrees Celsius");
display.println("");
display.print("Humidity: ");
display.print(humidity);
display.println(" %");
display.println("");
display.print("Luminosity: ");
display.print(luminosity);
display.println(" lux");
display.display();
delay(2000); //wait 2s between measurements
}else{
Serial.println("NO Motion Detected");
display.println("NO movement!!!");
display.display();
}
delay(1000); //wait 1s between measurements
} //void loop
//Read SD directory files
void printDirectory(File dir, int numTabs) {
while (true) {
File entry = dir.openNextFile();
if (! entry) {
// no more files
break;
}
for (uint8_t i = 0; i < numTabs; i++) {
Serial.print('\t');
}
Serial.print(entry.name());
if (entry.isDirectory()) {
Serial.println("/");
printDirectory(entry, numTabs + 1);
} else {
// files have sizes, directories do not
Serial.print("\n");
//Serial.print("\t\t");
//Serial.println(entry.size(), DEC);
}
entry.close();
}
}
void appendFile(const char * path, String message){
Serial.printf("Appending to file: %s\n", path);
File file = SD.open(path, FILE_APPEND);
if(!file){
Serial.println("Failed to open file for appending");
return;
}
if(file.print(message)){
Serial.println("Message appended\n");
} else {
Serial.println("Append failed\n");
}
file.close();
}