#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <DHT_U.h>
// Define pins
#define BUTTON_ADD_PIN 15
#define BUTTON_REMOVE_PIN 4
#define DHT_PIN 13
#define SLIDE_SWITCH_PIN 17
#define TRIGGER_PIN 5
#define ECHO_PIN 18
#define BUZZER_PIN 19
#define RED_LED_PIN 23
#define GREEN_LED_PIN 16
// LED Bar Graph Pins
const int ledBarPins[] = {34, 35, 32, 33, 25, 26, 27, 14, 12, 2}; // Example GPIO pins
// Constants
#define DHT_TYPE DHT22
#define ITEM_THRESHOLD 2
#define TEMP_THRESHOLD 27
#define MAX_ITEMS 10
// Global variables
int itemCount = 0;
DHT dht(DHT_PIN, DHT_TYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
// Initialize serial communication
Serial.begin(115200);
// Initialize pins
pinMode(BUTTON_ADD_PIN, INPUT_PULLUP);
pinMode(BUTTON_REMOVE_PIN, INPUT_PULLUP);
pinMode(SLIDE_SWITCH_PIN, INPUT_PULLUP);
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(RED_LED_PIN, OUTPUT);
pinMode(GREEN_LED_PIN, OUTPUT);
// Initialize LED bar graph pins
for (int i = 0; i < MAX_ITEMS; i++) {
pinMode(ledBarPins[i], OUTPUT);
digitalWrite(ledBarPins[i], LOW);
}
// Initialize DHT sensor
dht.begin();
// Initialize LCD
lcd.init();
lcd.backlight();
// Display initial message
lcd.setCursor(0, 0);
lcd.print("Item Count:");
lcd.setCursor(0, 1);
lcd.print(itemCount);
}
void loop() {
// Check slide switch
if (digitalRead(SLIDE_SWITCH_PIN) == LOW) {
powerOff();
return;
}
// Check buttons
if (digitalRead(BUTTON_ADD_PIN) == LOW) {
addItem();
delay(200); // Debounce delay
}
if (digitalRead(BUTTON_REMOVE_PIN) == LOW) {
removeItem();
delay(200); // Debounce delay
}
// Check temperature
float temperature = dht.readTemperature();
if (temperature < TEMP_THRESHOLD) {
digitalWrite(RED_LED_PIN, HIGH);
digitalWrite(BUZZER_PIN, HIGH);
} else {
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
}
// Update item status
if (itemCount < ITEM_THRESHOLD) {
digitalWrite(RED_LED_PIN, HIGH);
digitalWrite(BUZZER_PIN, HIGH);
digitalWrite(GREEN_LED_PIN, LOW);
} else {
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(GREEN_LED_PIN, HIGH);
}
// Update LCD and bar graph
lcd.setCursor(0, 1);
lcd.print(" "); // Clear the line
lcd.setCursor(0, 1);
lcd.print(itemCount);
// Display appropriate message on LCD based on item count
if (itemCount < ITEM_THRESHOLD) {
lcd.setCursor(0, 0);
lcd.print("Please topup this");
lcd.setCursor(0, 1);
lcd.print("item in rack 1 ");
} else {
lcd.setCursor(0, 0);
lcd.print("Item is not ");
lcd.setCursor(0, 1);
lcd.print("ready to repl. ");
}
// Update LED bar graph
updateLEDBarGraph(itemCount);
delay(100);
}
void addItem() {
itemCount++;
if (itemCount > MAX_ITEMS) itemCount = MAX_ITEMS; // Assuming 10 is the max item count
}
void removeItem() {
itemCount--;
if (itemCount < 0) itemCount = 0;
}
void powerOff() {
// Turn off all outputs
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(GREEN_LED_PIN, LOW);
for (int i = 0; i < MAX_ITEMS; i++) {
digitalWrite(ledBarPins[i], LOW);
}
// Display power off message
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Power Off");
// Stay here until the switch is turned back on
while (digitalRead(SLIDE_SWITCH_PIN) == LOW) {
delay(100);
}
// Clear power off message
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Item Count:");
lcd.setCursor(0, 1);
lcd.print(itemCount);
}
void updateLEDBarGraph(int itemCount) {
for (int i = 0; i < MAX_ITEMS; i++) {
if (i < itemCount) {
digitalWrite(ledBarPins[i], HIGH);
} else {
digitalWrite(ledBarPins[i], LOW);
}
}
}