273 lines
5.3 KiB
C++
273 lines
5.3 KiB
C++
#include <DHT.h>
|
|
#include <IRremote.h>
|
|
#include <Wire.h>
|
|
#include <LiquidCrystal_I2C.h>
|
|
#include <math.h>
|
|
|
|
#define IR_RECEIVE_PIN 2
|
|
#define US_TRIG_PIN 3
|
|
#define US_ECHO_PIN 4
|
|
#define DHT_RECEIVE_PIN 5
|
|
#define SOUND_RECEIVE_PIN A0
|
|
#define WATER_RECEIVE_PIN A1
|
|
#define WATER_POWER_PIN 6
|
|
|
|
DHT dht(DHT_RECEIVE_PIN, DHT11);
|
|
LiquidCrystal_I2C lcd(0x27, 16, 2);
|
|
LiquidCrystal_I2C timerLcd(0x26, 16, 2);
|
|
|
|
static void IrReceiver_Setup(uint8_t recvPin);
|
|
static uint32_t IrRecever_GetRemoteKey(void);
|
|
#define KEYONE 0XF30CFF00
|
|
#define KEYTWO 0XE718FF00
|
|
#define KEYTHREE 0XA15EFF00
|
|
#define KEYFOUR 0XF708FF00
|
|
#define KEYEQ 0XE619FF00
|
|
#define KEYUNDEF 0xFFFFFFFF
|
|
|
|
struct temp_hum {
|
|
float t;
|
|
float h;
|
|
};
|
|
|
|
static void Ultrasonic_Setup(uint8_t trigPin, uint8_t echoPin);
|
|
static uint32_t Ultrasonic_GetDistance(uint8_t trigPin, uint8_t echoPin);
|
|
static void Ultrasonic_PrintDistance(uint32_t distance);
|
|
|
|
static struct temp_hum TempHum_GetData(void);
|
|
static void TempHum_PrintData(struct temp_hum th);
|
|
|
|
static uint32_t Sound_GetData(uint8_t soundPin);
|
|
static void Sound_PrintData(uint32_t soundLevel);
|
|
|
|
static uint32_t Water_GetLevel(void);
|
|
static uint32_t Water_PrintLevel(uint32_t waterLevel);
|
|
|
|
static void TimerLcd_Print(void);
|
|
|
|
bool mainMenu = 1;
|
|
bool mainMenuPage = 0;
|
|
|
|
void setup() {
|
|
IrReceiver_Setup(IR_RECEIVE_PIN);
|
|
Ultrasonic_Setup(US_TRIG_PIN, US_ECHO_PIN);
|
|
|
|
dht.begin();
|
|
|
|
lcd.init();
|
|
lcd.backlight();
|
|
|
|
timerLcd.init();
|
|
timerLcd.backlight();
|
|
timerLcd.clear();
|
|
|
|
Serial.begin(9600);
|
|
}
|
|
|
|
void loop() {
|
|
uint32_t key;
|
|
uint32_t distance;
|
|
struct temp_hum th;
|
|
uint32_t soundLevel;
|
|
|
|
TimerLcd_Print();
|
|
|
|
if (mainMenuPage == 0) {
|
|
lcd.clear();
|
|
lcd.setCursor(0, 0);
|
|
lcd.print("1.Temperatura");
|
|
lcd.setCursor(0, 1);
|
|
lcd.print("2.Distanta");
|
|
|
|
mainMenuPage = 1;
|
|
} else {
|
|
lcd.clear();
|
|
lcd.setCursor(0, 0);
|
|
lcd.print("3.Niv. sunet");
|
|
lcd.setCursor(0, 1);
|
|
lcd.print("4.Niv. apa");
|
|
|
|
mainMenuPage = 0;
|
|
}
|
|
delay(1500);
|
|
|
|
|
|
key = IrRecever_GetRemoteKey();
|
|
|
|
switch (key) {
|
|
case KEYONE:
|
|
lcd.clear();
|
|
while (true) {
|
|
TimerLcd_Print();
|
|
th = TempHum_GetData();
|
|
TempHum_PrintData(th);
|
|
|
|
key = IrRecever_GetRemoteKey();
|
|
if (key == KEYEQ)
|
|
break;
|
|
}
|
|
break;
|
|
case KEYTWO:
|
|
lcd.clear();
|
|
while (true) {
|
|
TimerLcd_Print();
|
|
distance = Ultrasonic_GetDistance(US_TRIG_PIN, US_ECHO_PIN);
|
|
Ultrasonic_PrintDistance(distance);
|
|
|
|
key = IrRecever_GetRemoteKey();
|
|
if (key == KEYEQ)
|
|
break;
|
|
}
|
|
break;
|
|
case KEYTHREE:
|
|
lcd.clear();
|
|
while (true) {
|
|
TimerLcd_Print();
|
|
soundLevel = Sound_GetData(SOUND_RECEIVE_PIN);
|
|
Sound_PrintData(soundLevel);
|
|
|
|
key = IrRecever_GetRemoteKey();
|
|
if (key == KEYEQ)
|
|
break;
|
|
}
|
|
break;
|
|
case KEYFOUR:
|
|
lcd.clear();
|
|
while (true) {
|
|
TimerLcd_Print();
|
|
Water_PrintLevel(Water_GetLevel());
|
|
|
|
key = IrRecever_GetRemoteKey();
|
|
if (key == KEYEQ)
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
static void IrReceiver_Setup(uint8_t recvPin)
|
|
{
|
|
IrReceiver.begin(recvPin, ENABLE_LED_FEEDBACK);
|
|
}
|
|
|
|
static uint32_t IrRecever_GetRemoteKey(void)
|
|
{
|
|
uint32_t result;
|
|
result = KEYUNDEF;
|
|
|
|
if (IrReceiver.decode()) {
|
|
result = IrReceiver.decodedIRData.decodedRawData;
|
|
IrReceiver.resume();
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
static void Ultrasonic_Setup(uint8_t trigPin, uint8_t echoPin)
|
|
{
|
|
pinMode(US_TRIG_PIN, OUTPUT);
|
|
pinMode(US_ECHO_PIN, INPUT);
|
|
}
|
|
|
|
static uint32_t Ultrasonic_GetDistance(uint8_t trigPin, uint8_t echoPin)
|
|
{
|
|
long duration;
|
|
uint32_t distance;
|
|
|
|
digitalWrite(trigPin, LOW);
|
|
delayMicroseconds(2);
|
|
digitalWrite(trigPin, HIGH);
|
|
delayMicroseconds(10);
|
|
digitalWrite(trigPin, LOW);
|
|
|
|
duration = pulseIn(echoPin, HIGH);
|
|
distance = duration * 0.034 / 2;
|
|
delay(100);
|
|
|
|
return distance;
|
|
}
|
|
|
|
static struct temp_hum TempHum_GetData(void)
|
|
{
|
|
struct temp_hum th;
|
|
|
|
th.h = dht.readHumidity();
|
|
th.t = dht.readTemperature();
|
|
|
|
return th;
|
|
}
|
|
|
|
static void TempHum_PrintData(struct temp_hum th)
|
|
{
|
|
lcd.setCursor(0, 0);
|
|
lcd.print("Temp: ");
|
|
lcd.print(th.t);
|
|
lcd.print("C");
|
|
|
|
lcd.setCursor(0, 1);
|
|
lcd.print("Hum: ");
|
|
lcd.print(th.h);
|
|
}
|
|
|
|
static void Ultrasonic_PrintDistance(uint32_t distance)
|
|
{
|
|
lcd.setCursor(0, 0);
|
|
lcd.print("Dist (cm): ");
|
|
lcd.print(distance);
|
|
}
|
|
|
|
|
|
static uint32_t Sound_GetData(uint8_t soundPin)
|
|
{
|
|
int i;
|
|
int sum = 0;
|
|
const int numReadings = 2048;
|
|
|
|
for (i = 0; i < numReadings; i++) {
|
|
sum += analogRead(soundPin);
|
|
delayMicroseconds(50);
|
|
}
|
|
|
|
sum /= numReadings;
|
|
|
|
return sum;
|
|
}
|
|
static void Sound_PrintData(uint32_t soundLevel)
|
|
{
|
|
float db;
|
|
|
|
db = 20 * log10(soundLevel);
|
|
|
|
lcd.setCursor(0, 0);
|
|
lcd.print("Decibels: ");
|
|
lcd.print(db);
|
|
}
|
|
|
|
static uint32_t Water_GetLevel(void)
|
|
{
|
|
uint32_t val;
|
|
|
|
val = analogRead(WATER_RECEIVE_PIN);
|
|
|
|
return val;
|
|
}
|
|
static uint32_t Water_PrintLevel(uint32_t waterLevel)
|
|
{
|
|
lcd.setCursor(0, 0);
|
|
lcd.print("Level: ");
|
|
|
|
if (waterLevel < 100) lcd.print("0");
|
|
if (waterLevel < 10) lcd.print("0");
|
|
lcd.print(waterLevel);
|
|
lcd.print("/700");
|
|
}
|
|
|
|
static void TimerLcd_Print(void)
|
|
{
|
|
unsigned long time = millis() / 1000;
|
|
|
|
timerLcd.setCursor(0, 0);
|
|
timerLcd.print("Uptime (s): ");
|
|
timerLcd.setCursor(0, 1);
|
|
timerLcd.print(time);
|
|
}
|