ems/ems.ino

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);
}