#include <IRremote.h>
#include <Wire.h>
#include <LiquidCrystal.h>
#define PIN_RECEIVER 2 // Signal Pin of IR receiver
#define NTC_PIN A0 // Analog pin for NTC temperature sensor
#define echoPin 5 // Echo Pin
#define trigPin 6 // Trigger Pin
IRrecv receiver(PIN_RECEIVER);
int maximumRange = 20; // Maximum range needed
int minimumRange = 15; // Minimum range needed
long duration, distance; // Duration used to calculate distance
int dtime;
const float BETA = 3950;
float objectTemp, stemp; // object temperature
int readcount = 0;
LiquidCrystal lcd(12, 11, 10, 9, 8, 7); // Adjusted pins for LCD
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600);
lcd.begin(16, 2); // Initialize LCD with 16 columns and 2 rows
lcd.print("Initializing...");
delay(2000);
lcd.clear();
receiver.enableIRIn(); // Start the IR receiver
}
void loop() {
// Trigger the ultrasonic sensor
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Read the echo
duration = pulseIn(echoPin, HIGH);
// Calculate the distance (in cm) based on the speed of sound.
distance = duration * 0.034 / 2;
// reading object temperature from NTC sensor
objectTemp = readNTCTemperature();
// print to Serial port
Serial.println("Object: " + String(objectTemp) + "C");
Serial.println(distance);
// display on LCD
lcd.clear();
lcd.setCursor(0, 0);
if (distance < minimumRange) {
lcd.print("TOO CLOSE!");
} else if (distance >= minimumRange && distance <= maximumRange) {
lcd.print("Distance: ");
lcd.print(distance);
lcd.print("cm");
} else {
lcd.print("GET CLOSER ");
}
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(objectTemp);
lcd.print(" C");
// until approx. 5 x 200 ms = 1 sec
// if user is out of range, reset calculation
if (distance < minimumRange || distance > maximumRange) {
dtime = 100;
readcount = 0;
stemp = 0;
}
// IR receiver part
if (receiver.decode()) {
translateIR();
receiver.resume(); // Receive the next value
}
delay(500); // Adding a 0.5 second delay
Serial.println("count: " + String(readcount));
}
float readNTCTemperature() {
int analogValue = analogRead(NTC_PIN);
float temperature = 1 / (log(1 / (1023. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
return temperature;
}
void translateIR()
{
// Takes command based on IR code received
switch (receiver.decodedIRData.command) {
case 162:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("POWER");
break;
case 226:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("MENU");
break;
case 34:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("TEST");
break;
case 2:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PLUS");
break;
case 194:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("BACK");
break;
case 224:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PREV.");
break;
case 168:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PLAY");
break;
case 144:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("NEXT");
break;
case 104:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: 34 C");
break;
case 152:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("MINUS");
break;
case 176:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("key: C");
break;
case 48:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: 34.5 C");
break;
case 24:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: 35 C");
break;
case 122:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: 35.5 C");
break;
case 16:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: 36 C");
break;
case 56:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: 36.5 C");
break;
case 90:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: 37 C");
break;
case 66:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: 37.5 C");
break;
case 74:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: 38 C");
break;
case 82:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: 38.5 C");
break;
default:
lcd.clear();
lcd.print(receiver.decodedIRData.command);
lcd.print(" other button");
}
}