#include <Wire.h>
#include <SoftwareSerial.h>
#include "DHT.h"
#include <MPU6050.h>
#include <LiquidCrystal_I2C.h> // Adăugați această linie pentru LCD
// Definire pinii
#define DHT_PIN 7
#define DHT_TYPE DHT22
#define ULTRASONIC_TRIG_PIN 12
#define ULTRASONIC_ECHO_PIN 11
#define BUZZER_PIN 10
#define LDR_PIN A1
#define THERMISTOR_PIN A0
#define ENCODER_PIN_A 4
#define ENCODER_PIN_B 5
// Variabile globale
String defaultUser = "user\n";
String defaultPassword = "parola\n";
int selectedOption = 0;
String inputUser, inputPassword;
volatile int encoderPulseCount = 0;
long ultrasonicDuration;
int ultrasonicDistance;
// Obiecte pentru senzori
DHT dht(DHT_PIN, DHT_TYPE);
MPU6050 mpu;
// Crearea obiectului pentru LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); // Adresa I2C (0x27) și dimensiunea 16x2
// Funcție ISR pentru encoder
void handleEncoderPulse() {
encoderPulseCount++;
}
// Funcție pentru senzorul ultrasonic
void readUltrasonicSensor() {
while (Serial.available() == 0) {
digitalWrite(ULTRASONIC_TRIG_PIN, LOW);
delayMicroseconds(10);
digitalWrite(ULTRASONIC_TRIG_PIN, HIGH);
ultrasonicDuration = pulseIn(ULTRASONIC_ECHO_PIN, HIGH);
ultrasonicDistance = ultrasonicDuration * 0.034 / 2;
if (ultrasonicDistance <= 200 && ultrasonicDistance >= 150) {
tone(BUZZER_PIN, 1000);
delay(300);
noTone(BUZZER_PIN);
delay(300);
} else if (ultrasonicDistance < 150 && ultrasonicDistance >= 100) {
tone(BUZZER_PIN, 800);
delay(150);
noTone(BUZZER_PIN);
delay(150);
} else if (ultrasonicDistance < 100 && ultrasonicDistance >= 50) {
tone(BUZZER_PIN, 600);
delay(50);
noTone(BUZZER_PIN);
delay(50);
} else if (ultrasonicDistance < 20) {
tone(BUZZER_PIN, 2000);
}
Serial.print("Distance: ");
Serial.println(ultrasonicDistance);
// Afișare pe LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Dist: ");
lcd.print(ultrasonicDistance);
lcd.print(" cm");
delay(300);
}
handleLogin();
}
// Funcție pentru senzorul DHT
void readTemperatureHumiditySensor() {
while (Serial.available() == 0) {
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
Serial.print("Humidity: ");
Serial.println(humidity);
Serial.print("Temperature: ");
Serial.println(temperature);
// Afișare pe LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.print(humidity);
lcd.print(" %");
delay(1000);
}
handleLogin();
}
// Funcție pentru LDR
void readLightSensor() {
const float fixedResistance = 10000.0; // Rezistența fixă din divizor (10 kΩ)
const float vcc = 5.0; // Tensiunea de alimentare (5V)
while (Serial.available() == 0) {
int rawValue = analogRead(LDR_PIN);
float voltage = rawValue * (vcc / 1023.0);
float resistance = (vcc - voltage) * fixedResistance / voltage;
float lux = pow((fixedResistance / resistance), 1.5) * 1000;
Serial.print("Lumina (raw): ");
Serial.println(rawValue);
Serial.print("Intensitate luminoasa (lux): ");
Serial.println(lux);
// Afișare pe LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("LDR: ");
lcd.print(rawValue);
lcd.setCursor(0, 1);
lcd.print("Lux: ");
lcd.print(lux);
delay(1000);
}
handleLogin();
}
// Funcție pentru termistor
void readThermistor() {
while (Serial.available() == 0) {
int rawValue = analogRead(THERMISTOR_PIN);
float voltage = rawValue * (5.0 / 1023.0);
float resistance = (5.0 - voltage) * 10000 / voltage;
float temperature = 1 / (0.001129148 + (0.000234125 * log(resistance)) + (0.0000000876741 * pow(log(resistance), 3))) - 273.15;
Serial.print("Temperatura: ");
Serial.println(temperature);
// Afișare pe LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print(" C");
delay(1000);
}
handleLogin();
}
// Funcție pentru encoder
void readEncoder() {
while (Serial.available() == 0) {
Serial.print("Pulsuri encoder: ");
Serial.println(encoderPulseCount);
delay(1000);
}
handleLogin();
}
// Funcție pentru MPU6050
void readMPU6050() {
while (Serial.available() == 0) {
int16_t accelX, accelY, accelZ, gyroX, gyroY, gyroZ;
mpu.getMotion6(&accelX, &accelY, &accelZ, &gyroX, &gyroY, &gyroZ);
Serial.print("Acceleratie: ax=");
Serial.print(accelX);
Serial.print(" ay=");
Serial.print(accelY);
Serial.print(" az=");
Serial.println(accelZ);
Serial.print("Giroscop: gx=");
Serial.print(gyroX);
Serial.print(" gy=");
Serial.print(gyroY);
Serial.print(" gz=");
Serial.println(gyroZ);
// Afișare pe LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Accel: ");
lcd.print(accelX);
lcd.print(", ");
lcd.print(accelY);
lcd.setCursor(0, 1);
lcd.print("Gyro: ");
lcd.print(gyroX);
delay(1000);
}
handleLogin();
}
// Funcția setup
void setup() {
pinMode(ULTRASONIC_TRIG_PIN, OUTPUT);
pinMode(ULTRASONIC_ECHO_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LDR_PIN, INPUT);
pinMode(THERMISTOR_PIN, INPUT);
pinMode(ENCODER_PIN_A, INPUT_PULLUP);
pinMode(ENCODER_PIN_B, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(ENCODER_PIN_A), handleEncoderPulse, RISING);
Serial.begin(9600);
dht.begin();
Wire.begin();
mpu.initialize();
lcd.begin(16, 2); // Inițializează LCD-ul
lcd.backlight(); // Aprinde iluminarea de fundal
Serial.println("User:");
while (Serial.available() == 0) {}
inputUser = Serial.readString();
Serial.println("Parola:");
while (Serial.available() == 0) {}
inputPassword = Serial.readString();
handleLogin();
}
// Funcția pentru afișarea meniului
void displayMenu() {
Serial.println("\nMenu");
Serial.println("0. Incheiere operatiune");
Serial.println("1. Senzor de umiditate si temperatura");
Serial.println("2. Senzor de ultrasunete");
Serial.println("3. LDR");
Serial.println("4. Termistor");
Serial.println("5. Encoder");
Serial.println("6. MPU6050");
}
// Funcția de logare și meniu
void handleLogin() {
if (inputUser == defaultUser && inputPassword == defaultPassword) {
Serial.println("Conectat");
displayMenu();
} else {
Serial.println("Nume sau parola incorecta");
setup();
}
}
// Funcția principală loop
void loop() {
Serial.println("Selectati optiunea: ");
while (Serial.available() == 0) {}
selectedOption = Serial.read() - '0';
switch (selectedOption) {
case 0:
Serial.println("Oprire");
while (1);
break;
case 1:
readTemperatureHumiditySensor();
break;
case 2:
readUltrasonicSensor();
break;
case 3:
readLightSensor();
break;
case 4:
readThermistor();
break;
case 5:
readEncoder();
break;
case 6:
readMPU6050();
break;
default:
Serial.println("Optiune invalida");
}
}