#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
#include "DHTesp.h"
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define PIN_TRIG 25
#define PIN_ECHO 26
#define pirPin 13
const int DHT_PIN = 12;
const float GAMMA = 0.7;
const float RL10 = 50;
const float BETA = 3950;
Adafruit_MPU6050 mpu;
sensors_event_t event;
DHTesp dhtSensor;
//LDR Pin 15
//DHT Pin 12
//PIR Pin 13
//NTC Pin 14
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation falled"));
for (;;);
}
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
pinMode(pirPin,INPUT);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
analogReadResolution(10);
while (!mpu.begin()) {
Serial.println("MPU6050 not connected!");
delay(1000);
}
Serial.println("MPU6050 ready!");
}
void loop(){
if(Serial.available()>0){
String command = Serial.readStringUntil('\n');
if(command == "abstand"){
abstand();
}else if (command == "humi"){
dht22();
}else if (command == "licht"){
ldr();
}else if (command == "temp2"){
ntc();
}else if (command == "beweg2"){
mpuSensor();
}else if (command == "beweg1"){
pir();
}
}
delay(10); // this speeds up the simulation
}
/*
Der Ultraschallsensor strahlt einen kurzen Schallimpuls aus.
Dieser bewegt sich mit Schallgeschwindigkeit in der Luft.
Trifft er auf ein Objekt, wird er dort reflektiert und gelangt als
Echo zurück zum Ultraschallsensor. Aus der Zeitspanne zwischen dem
Aussenden des Schallimpulses und dem Empfang des Echosignals
berechnet das Programm die Entfernung zum Objekt. Der Sensor benötigt zwei
digitale GPIOS.
*/
void abstand(){
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
int duration = pulseIn(PIN_ECHO, HIGH);
Serial.print("Distance in CM: ");
Serial.println(duration / 58);
delay(500);
printDisplay("Distance in CM:",String(duration/58));
}
/*
Der DHT beinhaltet einen NTC (siehe ntc unten) und einen luftfeuchtigkeitabhänhigen Kondensator.
Bei Änderung der Luftfeuchtigkeit ändert sich die Kapazität des Kondensator und ein Chip ermittelt aus
dieser Änderung wieder den Wert der Luftfeuchtigkeit. Der Sensor arbeitet auf einem eigenen
Ein-Draht (One-Wire oder Single-Wire) Protokoll und benötigt einen digitalen GPIO
*/
void dht22(){
TempAndHumidity data = dhtSensor.getTempAndHumidity();
Serial.println("Temp: " + String(data.temperature, 2) + "°C");
Serial.println("Humidity: " + String(data.humidity, 1) + "%");
Serial.println("---");
delay(200);
printDisplay("Temperatur: ",String(data.temperature, 2)+"Grad");
delay(2000);
printDisplay("Luftfeuchtigkeit: ",String(data.humidity, 1)+"%");
}
/*
Der LDR ist ein lichtabhängiger Widerstand. Über einen Spannungsteiler wird eine Spannung
eingelesen (analog-digital-Wandler), diese kann dann in den Widerstandswert und damit in den
Temperaturwert umgerechnet werden.
*/
void ldr(){
int analogValue = analogRead(15);
analogValue = map(analogValue, 4095, 0, 1024, 0);
float voltage = analogValue / 1024.0 * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
Serial.print("Lichtstärke: ");
Serial.print(lux);
Serial.println (" lux");
printDisplay("Helligkeit: ",String(lux, 2)+"lux");
}
/*
Der NTC ist ein spannungsabhängiger Widerstand. Das N steht für negativ, dies bedeutet,
dass mit höherer Temperatur der Widerstand sinkt. Über einen Spannungsteiler wird eine Spannung
eingelesen (analog-digital-Wandler), diese kann dann in den Widerstandswert und damit in den
Temperaturwert umgerechnet werden.
*/
void ntc(){
int analogValue = analogRead(14);
float celsius = 1 / (log(1 / (1023. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
Serial.print("Temperature: ");
Serial.print(celsius);
Serial.println(" ℃");
printDisplay("Temperatur: ",String(celsius, 2)+"Grad");
}
/*
Im MPU6050 befinden sich „Micro-Electric-Mechanical Systems“ (MEMS).
Im Fall von Gyroskopen sind das beweglich aufgehängte Körper, die bei
Beschleunigung ihre Lage gegenüber einem festen Rahmen verändern.
Die Abstandsänderung führt zu einer Änderung der Kapazität.
Der Sensor arbeitet auf dem I2C-Bus und hängt an den Pins 22 (SCL) und 21 (SDA)
*/
void mpuSensor(){
sensors_event_t a, g, temp;
mpu.getAccelerometerSensor()->getEvent(&event);
mpu.getEvent(&a, &g, &temp);
Serial.print("[");
Serial.print(millis());
Serial.print("] X: ");
Serial.print(a.acceleration.x);
Serial.print(", Y: ");
Serial.print(a.acceleration.y);
Serial.print(", Z: ");
Serial.print(a.acceleration.z);
Serial.println(" m/s^2");
Serial.print("Gyro: ");
Serial.print(g.gyro.x);
Serial.print(", Y: ");
Serial.print(g.gyro.y);
Serial.print(", Z: ");
Serial.print(g.gyro.z);
Serial.println(" Bogenmaß");
printDisplay("Beschleunigung:","");
delay(2000);
printDisplay("X-Achse: ",String(a.acceleration.x));
delay(2000);
printDisplay("Y-Achse: ",String(a.acceleration.y));
delay(2000);
printDisplay("Z-Achse: ",String(a.acceleration.z));
delay(2000);
printDisplay("Neigung: ","");
delay(2000);
printDisplay("X-Achse: ",String(g.gyro.x));
delay(2000);
printDisplay("Y-Achse: ",String(g.gyro.y));
delay(2000);
printDisplay("Z-Achse: ",String(g.gyro.z));
}
/*
Die Bewegung wird dadurch festgestellt, dass der Sensor die Wärmestrahlung eines Körpers
erfassen kann. Durch zwei gleichzeitige Messungen wird eine Differenz gemessen, diese ist 0, wenn
beide Messungen den selben Wert ergeben (keine Bewegung). Findet eine Bewegung statt, so misst einer der beiden Sensoren mehr als der andere
, die Diffenrenz ist ungleich 0 und der PIR spricht an. Man kann nur ein digitales Signal abnehmen
(HIGH -> Bewegung, LOW -> keine Bewgung)
*/
void pir(){
for(int i = 0; i < 200;i++){
if(digitalRead(pirPin)==HIGH){
Serial.println("Bewegung festgstellt");
printDisplay("Bewegung: ","festgestellt");
break;
}
delay(10);
}
printDisplay("Bewegung","nicht festgestellt");
}
void printDisplay(String einheit, String wert){
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.println(einheit);
display.println(wert);
display.display();
}